2013-02-12 19 views
7

Jestem w trakcie nauki Guice i nie bardzo rozumiem, jak korzystać z instancji Injector. Lepiej jest utworzyć instancję Injector raz na bootstrapie aplikacji i sprawić, by była publiczna?Jak korzystać z wtryskiwacza Guice?

Czy to prawda, że ​​zawsze musimy używać Injector#getInstance(SomeClass.class), aby uzyskać klasy, w których wstawiliśmy adnotacje Guice'a @Inject?

+0

Lepiej nie używać 'Injector.getInstance()' w ogóle. – millimoose

+2

@montimoose, ale jakie są inne metody pobierania klas zarządzanych przez Guice? – MyTitle

+0

W polach z adnotacją '@ Inject' powinny być dostępne odpowiednie klasy" automagicznie ". (Zakładając, że Guice zarządza klasami, które również wymagają wstrzykiwania.) Pomysł polega na tym, że pojemnik zarządza obydwoma zależnościami, ** i ** klasami, które z nich korzystają, i pobiera tylko jedną "główną" klasę z wtryskiwacza ręcznie aby uruchomić swoją aplikację. Powinieneś również rozważyć [ponowne przeczytanie samouczka] (https://code.google.com/p/google-guice/wiki/GettingStarted), to jest Dependency Injection 101. – millimoose

Odpowiedz

7

Nie należy podawać wtryskiwacza jako globalnego singletonu. Czy spojrzałeś na: https://github.com/google/guice/wiki/GettingStarted? Zauważ, że RealBillingService nie używa wtryskiwacza, aby uzyskać instancje CreditCardProcessor i . Zamiast tego Guice załatwia to wszystko podczas tworzenia instancji.

Jeśli jesteś w sytuacji, w której potrzebujesz Guice do tworzenia wielu obiektów tego samego typu, rozważ użycie Provider i wstrzyknięcie tego dostawcy.

+0

Tak, rozumiem to. Ale co jeśli mam wiele usług takich jak 'RealBillingService', a każda z nich ma adnotacje' @ Inject' do wstrzykiwania obiektów 'CreditCardProcessor' i' TransactionLog'. Potrzebuję więc użyć 'Injector # getInstance' dla każdej usługi takiej jak' RealBillingService'. Ale chcę tworzyć te usługi w różnych miejscach, więc mam 2 warianty: utwórz obiekt 'Injector' w każdym miejscu i użyj' Injector # getInstance' do pobrania niezbędnej usługi _or_ do utworzenia instancji 'Injector' po jej udostępnieniu (globalny singleton) do wszystkich miejsc, gdzie go potrzebuję. – MyTitle

+0

Albo masz trzeci obiekt, który ma wystąpienia twoich dwóch usług (obie opisane za pomocą '@ Inject'). Wtedy użyjesz 'Injector', aby uzyskać pojedynczą instancję tego trzeciego obiektu. – condit

+0

W praktyce rzadko widać "iniektor". Jeśli używasz 'Jersey' z' Guice', na przykład, konfigurujesz swoje moduły, a struktura zajmuje się resztą. – condit

Powiązane problemy