Quando si annota una classe con @Component, significa che si tratta di Spring Bean e Singleton?


111

Essendo abbastanza nuovo per Spring, ho una domanda sull'annotazione di una classe. Quando si annota una classe con @Componentquesto significa che questa classe sarà uno Spring Bean e per impostazione predefinita un singleton?

Risposte:


129

Sì, è corretto, @Componentè un fagiolo primaverile e un Singleton.

Se la classe appartiene al livello di servizio, potresti voler annotarla @Service posto

Ma tieni presente che per poter rilevare queste annotazioni, devi inserire questa riga in applicationContext.xml:

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

Informazioni sui singleton: per impostazione predefinita, i bean spring sono tutti nell'ambito singleton. L'unica cosa che devi tenere a mente è che non dovresti memorizzare lo stato nelle variabili di campo (dovrebbero contenere solo le dipendenze). Pertanto la tua applicazione sarà thread-safe e non avrai bisogno di una nuova istanza di un bean ogni volta. In altre parole, i tuoi fagioli sono apolidi.


1
Quando utilizzo le annotazioni @Component e / o @Service ecc. Significa che sto creando Singleton, non incorrerò in problemi di concorrenza? Secondo la mia idea per principianti, risulterà in un bean che viene utilizzato in tutto ApplicationContext, quindi gli utenti simultanei otterranno un riferimento al singolo bean. Oppure mi sfugge qualcosa?
Marco

3
@Marco se non hai alcuno stato (variabili di istanza diverse dai bean spring), non si verificheranno problemi di concorrenza.
Bozho

"vuoi" richiedere una nuova istanza di un bean ogni volta o "non vuoi" richiedere una nuova istanza di un bean ogni volta?
Harshana

@ Bozho Cosa intendi con: "e non richiederai una nuova istanza di un fagiolo ogni volta"? Significa che Spring non dovrà creare una nuova istanza o tu come sviluppatore non avrai bisogno di creare una nuova istanza?
user1766169

24

Per impostazione predefinita: Sì.

Tuttavia, puoi sovrascrivere questo comportamento utilizzando l' @Scopeannotazione. Per esempio:@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.