2012-04-13 15 views
12

Moje rozumienie Guice jest to, że:Guice: implikacje zastrzyku pola

  • wtrysk Konstruktor poziomu (@Inject public class Widget(Dep one, Dep two)) implikuje że Guice zawsze wstrzykiwać że konstruktor za każdym razem jest ona wywoływana przez Injector; i
  • wtrysk Metoda poziomu (@Inject public void setDepOne(Dep one)) implikuje że Guice zawsze wstrzykiwać tej metody, kiedy to nazywa, tak długo, jak długo obiekt Widget został stworzony przy użyciu Guice Injector

Czy te dwa założenia są prawidłowe? Jeśli nie, wyjaśnij!

Więc na co mnie powiesiłam: jakie są implikacje wtrysku na poziomie pola?

@Inject private Dep one; 

Czy to znaczy, że Guice zawsze wstrzykiwać właściwość, gdy obiekt jest tworzony przez wtryskiwacz Guice? W takim przypadku wyobrażałbym sobie, że jest to sprzeczne z zastrzykiem poziomu konstruktora.

Na przykład, wykonuje następujące powodować konflikt/error:

public class Widget { 
    @Inject private Dep one; 

    private Dep two; 

    // Dep one already injected as a field! 
    @Inject public Widget(Dep one, Dep two) { 
     // ... 
    } 
} 

Z góry dzięki!

Odpowiedz

0

Twoje założenia są poprawne. Wierzę, że w tym konkretnym przypadku Guice wstrzyknie dwa razy one - raz przez konstruktora, raz przez pole - jeśli nic innego, ponieważ nie może wiedzieć, że jedzie na to samo pole.

19

Guice zawsze będzie wstrzykiwać wszystkie pola, metody i każdy pojedynczy konstruktor opatrzony komentarzem @Inject. Pamiętaj, że konstruktor zawsze jest najpierw wstrzykiwany, więc twoje adnotowane pole faktycznie zastąpi ten zastrzyk. Weź ten zmodyfikowany przykład:

class Widget { 
    @Inject 
    private Dep one; 

    @Inject 
    public Widget(Dep one) { 
     this.one = one; 
     System.out.println(one); 
    } 

    public void printDependency() { 
     System.out.println(one); 
    } 
} 

class Dep {} 

public class MyMain { 
    public static void main(String[] args) { 
     Injector i = Guice.createInjector(); 
     i.getInstance(Widget.class).printDependency(); 

    } 
} 

Po uruchomieniu, będzie produkować coś takiego:

[email protected] 
[email protected] 

wyra dwa różne obiekty. Pierwsza linia to konstruktor; drugi to wtrysk polowy.

Nieczęsto znalazłem zastosowanie do iniekcji polowych, z wyjątkiem ograniczania gadatliwości przy pisaniu próbek kodu Guice. W kodzie produkcyjnym jest to niemądre, ponieważ utrudnia testowanie kodu.

+0

Guice zawsze tworzy nowe wystąpienie każdej zależności, którą wstrzykuje, chyba że znajdzie jakieś inne powiązanie, na przykład singleton. – logan

+0

czy możesz wyjaśnić, dlaczego nie nadaje się do testowania? – suitianshi

+0

W tym przypadku pola wstrzyknięte są prywatne, co utrudnia dostęp bez użycia odbicia. –