2012-06-08 6 views
5

Od pewnego czasu stopniowo uporałem się ze Springem i sądzę, że mam rozsądne pojęcie o tych koncepcjach, jednak natknąłem się na informacje w innym z moich wątków, które wywróciły do ​​góry nogami me ...Wiosenne prototypy fasoli i korzyści ze sprężyny

”... chociaż metody inicjalizacji cyklu oddzwonienia nazywane są na wszystkich obiektach, niezależnie od zakresu, w przypadku prototypów, skonfigurowany zniszczenie callbacks cyklu życia nie są nazywane. Kod klient musi posprzątać prototype- obiektów o ograniczonym zasięgu i zwalniać drogie zasoby, które utrzymują prototypowe komponenty bean. Aby zmaksymalizować pojemność zasobu przechowywanego przez fasole o rozmiarze prototypowym, spróbuj użyć niestandardowego procesora końcowego, który zawiera odniesienie do fasoli, która trzeba się oczyścić. "

Dało mi to do myślenia, że ​​mam rzeczywiste przypadki użycia, w których chciałbym użyć fasoli prototypowej, na przykład potrzebuję "nowej" instancji komponentu bean na żądanie. Jednak z tego, co rozumiem w tym fragmencie (z dokumentów Spring 3), Spring trzyma odnośnik do fasoli, która musi zostać oczyszczona (sama referencja oznacza, że ​​komponent bean nie zostanie automatycznie wyczyszczony przez garbage collector). Ponadto biorę to z tego, że zasoby posiadane przez prototypową fasolę muszą być ręcznie oczyszczone.

Czy ktoś może mi powiedzieć, czy to prawda? Jeśli tak, to czy istnieje typowy wzór używany do radzenia sobie z tym? Byłbym wdzięczny za odpowiedź, która mogłaby opisać architektoniczny powód, dla którego Spring implementuje prototypowe fasole w ten sposób.

+1

W przypadku trzeba to zakrojony na żądanie możesz zakres żądania użytkownika;) http://static.springsource.org/spring/docs/3.0.0.M3/spring-framework-reference /html/ch04s04.html –

+0

@Spaeth Przepraszam, że mogłem wprowadzać w błąd ... to nie jest aplikacja internetowa, próbowałem tylko zademonstrować potrzebę utworzenia nowej instancji, aby obsłużyć "coś", co się stało – JLove

Odpowiedz

13

Wiosna trzyma się odniesienie do ziarna, które muszą być czyszczone (sama odniesienia oznacza, że ​​fasola nie zostaną skasowane automatycznie przez garbage collector).

Tak, ale kontener nie zawiera odniesień do fasoli o zakresie prototypowym. Z tego powodu wywołania zwrotne nie są wywoływane: Spring tworzy instancję bean, łączy ją i wywołuje zwroty konstrukcyjne. Daje instancję i zapomina o tej fasoli.

Można bezpiecznie utworzyć fasolę o rozmiarze prototypowym na żądanie. Wiosna da ci instancję i chwila, w której nie masz żadnych odniesień do tej fasoli (Wiosna nie zachowuje jednego!), To będą śmieci zebrane. Ale ponieważ Spring nie wie nic o twoim komponencie bean po jego utworzeniu - nie może wywołać żadnego wywołania destrukcji. W rzeczywistości sprowadza się to do pytania: dlaczego Java nie ma destruktorów.

Jak wyczyścić fasolę o rozmiarze prototypowym? Cóż, tak samo jak my, czyścisz inne zasoby w Javie - jawnie. Zapewnić close(), destroy(), stop() nazwa lub cokolwiek chcesz (rozważyć wdrożenie Closeable. Należy pamiętać, że zazwyczaj nie są potrzebne takie metody. Zbieracz śmieci wyda cały wykres obiektu podczas trwały zasób jak połączenia z bazą danych zostanie zamknięta, gdy cały DataSource jest zamknięta.

+1

Dzięki za ciebie odpowiedź ... w ten sposób sądziłem, że działa przed przeczytaniem tego fragmentu, może właśnie źle to zinterpretowałem! Zasadniczo ... kontynuuj jak poprzednio, zostawiając ślad zniszczenia, a wszystko zostanie oczyszczone za mną :-) – JLove

7

Ty misread dokumentację To jawnie mówi.

aby uzyskać pojemnik Wiosna, aby zwolnić zasoby posiadane przez prototypowych-scoped fasoli, spróbuj użyć niestandardowego fasoli post-procesor, który posiada odniesienie do fasola, która musi być c pochylił się.

Tak więc wiosna nie ma żadnego odniesienia do prototypowych ziaren, które tworzy. Od Ciebie zależy, czy utworzysz procesor komponentu bean, który w razie potrzeby będzie zawierał odniesienia do tych komponentów.

Co więcej, prototypowe fasole rzadko przechowują zasoby, które muszą zostać oczyszczone. Na przykład pula połączeń (która musi zostać poprawnie zniszczona podczas zamykania) jest zwykle pojedynczą komórką. Nie ma sensu, aby stał się prototypem. Ponieważ prototypowe fasole są często używane przez niewielką ilość czasu, klient, który je tworzy, może wyraźnie zwolnić swoje zasoby, gdy już go nie używa. Podobnie jak przy tworzeniu nowego strumienia lub połączenia i zamykania go w bloku finally.

3

Wiosna nie ma wiedzy na temat wszystkich instancji utworzonych przy użyciu zakresu prototypu. Po prostu utworzy instancję i skonfiguruje komponenty o rozmiarze prototypowym i przekaże ją klientowi, skomentowana w dokumentacji.

Wiosna nie udaje kompletny cykl prototypu fasoli: pojemnik instancję, konfiguruje ozdabia i inaczej montuje obiekt prototypowy, oddaje go do klienta, a potem nie ma dalszych znajomość tej instancji prototypu .

http://static.springsource.org/spring/docs/3.0.0.M3/spring-framework-reference/html/ch04s04.html#beans-factory-scopes-prototype