2013-08-26 20 views
8

Wciąż jestem nowy w Guice i nie korzystałem wcześniej z żadnych frameworków DI. Po przeczytaniu oficjalnej strony wiki i wielu innych dokumentów wciąż nie jestem w stanie całkowicie tego objąć.Guice - Wstrzykiwanie wtyczki do klasy za pomocą statycznych metod pomocniczych

W moim konkretnym przypadku chcę napisać funkcję taglib EL, która używa innej klasy (do wstrzyknięcia). Ponieważ wszystkie funkcje taglib muszą być zadeklarowane jako statyczne, nie mogę po prostu @Inject mojej zależności przez konstruktor lub setter. Pomyślałem o użyciu metody requestStaticInjection() opisanej w http://code.google.com/p/google-guice/wiki/Injections#Static_Injections, ale nie udało mi się jej uruchomić i nie znalazłem dobrego samouczka.

Dzięki z góry za wszelką pomoc,

Arman

+2

"Nie mogę go uruchomić" Więc co próbowaliście? –

Odpowiedz

16

Nie ma się o wiele bardziej wyraźne niż tej dokumentacji Guice ale oto test jednostka, która pokazuje przykład, jak można wykorzystać zastrzyk statyczny:

public class StaticInjectionExample { 

    static class SomeClass {} 

    static class TagLib{ 
    @Inject 
    static SomeClass injected; 

    public static void taglibFunction(String foo) { 
     injected.something(foo); 
    } 

    } 

    static class TestModule extends AbstractModule { 
    @Override 
    protected void configure() { 
     requestStaticInjection(TabLib.class); 
    } 
    } 

    @Test 
    public void test() { 
    Injector injector = Guice.createInjector(new TestModule()); 
    TagLib receiver = injector.getInstance(TagLib.class); 
    // Do something with receiver.injected 
    } 
} 
+0

Dziękuję za odpowiedź. Spróbuję tego. Ale czy to uhonoruje depedency wstrzyknięte przez innych wtryskiwaczy? Na przykład, czy Guice użyje tej samej instancji, jeśli wstrzyknięta klasa została oznaczona jako @Singleton? – Arman

+0

Nie jestem pewien, co masz na myśli przez "inne wtryskiwacze". Jeśli zwiążesz 'Injected' jako' @ Singleton', to ta pojedyncza instancja zostanie użyta podczas iniekcji (w tym iniekcji statycznej) dla całego modułu. – condit

+0

Zgodnie z dokumentacją Guice, zwykle tworzysz wtryskiwacz w projekcie sieci Web w ServletContextListener rozszerzającym GuiceServletContextListener. Więc jeśli utworzę dodatkowy Injector wewnątrz jakiejś klasy, czy Guice wstrzyknie tę samą klasę @Singleton, jaką miałby "ServletContextListener-Injector"? – Arman

Powiązane problemy