2010-11-12 7 views
14

chciałbym zapytać, jaka jest różnica międzyGuice: Różnica między Binder # bindConstant() i spoiwo # bind() ... toInstance

bindConstant().annotatedWith(Names.named("keepAliveInterval")).to(60); 

i

bind(Integer.TYPE).annotatedWith(Names.named("keepAliveInterval")).toInstance(60); 

chciałbym wczytaj wszystkie moje właściwości konfiguracyjne za pomocą Names.bindProperties (binder(), prop); w moim module i odkryłem, że używa tej ostatniej do wiązania właściwości.

Dzięki, chodzi

dla Marek

+0

+1 Myślałem tylko o zrobieniu czegoś podobnego. – Jeremy

Odpowiedz

10

myślę powodów, aby korzystać z bindConstant() są:

  • To wymaga korzystania z adnotacją wiążące. Nie możesz wykonać bindConstant().to(foo). Ponieważ typy, z którymi się łączysz, są prymitywami i są mało prawdopodobne, że dla każdej z nich wiązanie bez adnotacji byłoby sensowne.
  • Wymaga mniejszego wysiłku, ponieważ nie trzeba określać typu (nawiasem mówiąc, bindConstant() wiąże się raczej z int do Integer.class niż z Integer.TYPE, nie mając pewności, czy to ma znaczenie).

myślę Names.bindProperties nie używa bindConstant tylko dlatego, że wewnętrzny kod i trochę więcej kodu jest OK, aby pominąć krok lub dwa w procesie podejmowania wiążących. W swoich własnych modułach użyłbym tylko bindConstant, ponieważ jest to łatwe i bardziej przejrzyste.

3

bindConstant() ma tę zaletę, że może ustawić różne prymitywy ze względu na predefiniowane instancje TypeConverter w samej Guice.

Weźmy następujący wiążącej definicji jako przykład:

bindContant().annotatedWith(@Names.named("c")).to("30");

Następnie w klasie gdzie chcesz wtrysku:

@Inject @Named("c") int value;

Guice zamieni związanego String do wiadomości int dla Ciebie. Jeśli nie, to tak powie.

Korzyścią z bindConstant() jest konwersja typu, która może się zdarzyć. Jawnie wiążące int nie daje tego luksusu.

+1

Jak dowodzi to, jak 'bindProperties()' nie używa 'bindConstant()', nie jest to całkowicie prawda. Użycie 'bind (String.class) ... .toInstance (" 30 ")' działa dobrze i pozwala na konwersję wiązania do 'int', podobnie jak' bindConstant() '. Nie wierzę, że "TypeConverter" dba o to, od czego zaczynałeś. – ColinD

+0

Tak naprawdę, jak wspomniałem w moim OP, Names.bindProperties nie używa bindConstant, a mimo to następuje konwersja typu (np. Host i port to String i int i oba są odpowiednio wstrzykiwane, ponieważ są to typy - bez błędów konwersji) – zeratul021

+1

To prawda, nie ma. Z punktu widzenia użytkownika należy to jednak wziąć pod uwagę, ponieważ jest to wewnętrzna logika Guice. – gpampara

Powiązane problemy