2012-05-13 10 views
8

Domyślnie, fasolka stworzona przez Spring jest singleton. Są bezpieczne dla wątków, ponieważ są bezpaństwowcami. Kiedy chcemy, aby Spring tworzył gipsu stanowego, musimy użyć zakresu prototypu do definicji fasoli. Musimy zadbać o kwestie związane z wątkami. Wszystkie bezpaństwowe ziarna zostaną zanieczyszczone, gdy zostaną wstrzyknięte przez prototypową fasolę. Po prostu nie mogę sobie wyobrazić, gdzie możemy użyć prototypu. Czy możesz podać typowy scenariusz, w którym możemy/potrzebujemy użyć prototypu Spring Bean? W jaki sposób możemy unieważnić stanowe zanieczyszczenie na innych ziarenkach singleton?Do czego służy prototyp Spring Bean?

Odpowiedz

12

Istnieje wiele powodów, dla których należy stosować zakres prototypu, np. Za każdym razem, gdy używa się "nowego" zamiast pojedynczego. Komponent bean dla każdego użytkownika, komponent bean na żądanie, kolekcja unikatowych komponentów bean itp. W końcu, w jakiejkolwiek nietrywialnej aplikacji, nie używasz nie-singletonów o wiele bardziej niż pojedynczych?

Fasola z pojedynczym kątem nie jest bezpieczna dla wątków, ponieważ jest pojedynczym – musi być napisana, aby była bezpieczna dla wątków. Nie magicznie stają się bezpiecznymi wątkami. Zasięg działania fasoli polega właśnie na tym, jej zakres: nie powoduje to, że ziarno jest odpowiednie dla konkretnego zakresu , to zależy od programisty.

+0

Nie zgadzam się z moim dobrym przyjacielem Davem tutaj. Osobiście miałem 0 dobrych powodów do stworzenia prototypu Spring Bean w dowolnej z moich aplikacji produkcyjnych. Zadałbym sobie pytanie, dlaczego potrzebujesz tego obiektu jako fasoli. Jeśli jest to rzeczywiście obiekt stanowy, czy jest to komponent Entity, który został utworzony przez JPA lub JDBC, tak, że i tak nie wywołujesz nowego? Czy jest to obiekt podobny do widoku DTO, ponownie po prostu zadzwoń tam nowy. Oto link do Martena, który mówi to samo .. http://forum.spring.io/forum/spring-projects/container/81737-when-to-set-scope-as-prototype – user1567291

+0

Wyjaśnienia na temat notowań w dół, szczególnie, gdy odpowiedź jest prawidłowa, kompletna i zaakceptowana, jest ogólnie dobrym pomysłem. –

1

Uważam, że fasola o rozmiarze prototypowym jest alternatywą dla klas fabrycznych używanych do tworzenia obiektów. Różnica polega na tym, że sprężyna z fasolą prototypową pozwoli ci zaoszczędzić trochę kodu na zastrzyk zależności, a także automatycznie zarekomenduje twoje obiekty do transakcji itp.

Sam preferuję podejście fabryczne. Jednym z rozsądnych scenariuszy dla zakresu prototypów, który napotkałem, był obiekt stanowy, potrzebny różnym znanym fasolom i każdy wymagał własnej kopii. Dedykowana klasa fabryczna byłaby zbędna w tym scenariuszu, ponieważ nie musiałem tworzyć obiektów w locie, ale tylko podczas tworzenia innych komponentów.