Czy dodając adnotację do klasy @Component, oznacza to, że jest to Spring Bean i Singleton?

111

Będąc całkiem nowym w Spring, mam pytanie dotyczące dodawania adnotacji do zajęć. Czy dodawanie adnotacji do klasy @Componentoznacza, że ​​będzie to Spring Bean, a domyślnie singleton?

Marco
źródło

Odpowiedzi:

130

Tak, zgadza się, @Componentto wiosenna fasola i singleton.

Jeśli klasa należy do warstwy usług, możesz @Servicezamiast tego dodać do niej adnotację

Pamiętaj jednak, że aby te adnotacje zostały wykryte, musisz umieścić ten wiersz w applicationContext.xml:

<context:component-scan base-package="com.yourcompany" />

Informacje o singletonach - wszystkie fasolki jare są domyślnie w zakresie pojedynczych. Jedyną rzeczą, o której musisz pamiętać, jest to, że nie powinieneś przechowywać stanu w zmiennych polowych (powinny one zawierać tylko zależności). Dzięki temu Twoja aplikacja będzie bezpieczna dla wątków i nie będziesz potrzebować za każdym razem nowej instancji komponentu bean. Innymi słowy, Twoje ziarna są bezpaństwowcami.

Bozho
źródło
1
Czy podczas korzystania z adnotacji @Component i / lub @Service itp., Co oznacza, że ​​tworzę Singletony, nie napotkam problemów z współbieżnością? Według mojego początkującego pomysłu spowoduje to powstanie fasoli, która jest używana w całym ApplicationContext, więc współbieżni użytkownicy otrzymają odniesienie do pojedynczego ziarna. A może coś mi brakuje?
Marco
3
@Marco, jeśli nie masz żadnego stanu (zmienne instancji inne niż jary), nie wystąpią żadne problemy ze współbieżnością.
Bozho
„chcesz” wymagać za każdym razem nowej instancji fasoli czy też „nie będziesz potrzebować nowej instancji fasoli za każdym razem?
Harshana
@Bozho Co masz na myśli mówiąc: „i nie będziesz potrzebować za każdym razem nowej instancji fasoli”? Czy oznacza to, że Spring nie będzie musiał tworzyć nowej instancji lub Ty jako programista nie będziesz musiał tworzyć nowej instancji?
user1766169
25

Domyślnie - tak.

Możesz jednak zmienić to zachowanie, używając @Scopeadnotacji. Na przykład:@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)

Lea Zus
źródło