2009-11-04 16 views
8

Czy istnieje zalecany wzorzec do zamykania/zamykania obiektów utworzonych za pomocą Guice?Dożywotnie zarządzanie za pomocą Google Guice

Cykl życia mam nastawione na to:

  1. Przygotuj moduł Guice
  2. Załóż wtryskiwacz
  3. Użyj wtryskiwacz poprzez kod w celu uzyskania przedmiotów (injector.getInstance(Foo.class))
  4. ...
  5. Zamknij wszystkie zasoby posiadane przez te obiekty (uchwyty plików, połączenia TCP itp.). Chcę, aby był to deterministyczny krok (nie "pewnego dnia, kiedy działa GC").
+0

Możesz chcieć dodać przykładowy kod do twojego pytania, bo naprawdę nie rozumiem tego, co masz na myśli. – dlinsin

+0

Dodano więcej szczegółów. – ripper234

+7

"Użyj wtryskiwacza przez swój kod, aby uzyskać obiekty (injector.getInstance (Foo.class))" - to jest zdecydowanie * nie * w jaki sposób Guice, lub dowolna DI, jest przeznaczona do użycia. To tylko lokalizator usług. Powinien być budowany wykres obiektów, a wtryskiwacz powinien być tworzony i odwoływać się tylko do klasy root bootstrapper. – ColinD

Odpowiedz

2

Chcę, aby był to deterministyczny krok (nie "pewnego dnia, kiedy działa GC").

Niestety, ale Java jest dla ciebie niewłaściwym językiem. Struktura DI nie wie, kiedy zniknęły wszystkie odniesienia do obiektu. Tylko GC o tym wie.

Jeśli posiadasz zasób "zamykalny", użyj wzoru try/finally, aby go zamknąć (patrz poniżej).

Closable c = // ... 
try { 
    c.use(); 
} finally { 
    c.close(); 
} 

Teraz do tyłu trochę peddle. Guice może wiedzieć, kiedy zakres zaczyna się i kończy. Twój niestandardowy zakres może uruchomić etap czyszczenia po zakończeniu. Ten zakres może nawet zwracać serwery proxy, więc obiekty będą nieważne, jeśli spróbujesz uzyskać dostęp poza ich dozwolonym zasięgiem. .

(Oh i +1 do ColinD - wstrzyknąć dostawców :)

EDIT: Guiceyfruit szwy mieć jakieś wsparcie dla Lifecycles

+2

Myślę, że to tylko klasyczne niezrozumienie tego, do czego służy GC (szczególnie łatwo popełnić ten błąd, jeśli programowałeś w C++). W języku gromadzenia śmieci, czas życia obiektów/GC nie ma nic wspólnego z wydaniem zasobów takich jak uchwyty plików czy gniazda sieciowe. –

+0

Blok kodu nie przydziela obiektu, więc nie jest odpowiedzialny za jego zwolnienie. W szczególności singletony (w module Guice) są uzyskiwane przez Injector.getInstance(), ale nie powinny być zamykane po użyciu. – ripper234

+1

Cały ten problem zależy od tego, co dokładnie robisz iw jakim kontekście. Różne obiekty mają różne cykle życia, różne zakresy itp., Więc nie ma łatwego rozwiązania. Czy robisz to w aplikacji internetowej? Czy mówisz głównie o zamykaniu singletonów podczas zamykania? – ColinD