TL; DR
L'annotazione @Autowired ti risparmia la necessità di eseguire il cablaggio da solo nel file XML (o in qualsiasi altro modo) e trova semplicemente per te ciò che deve essere iniettato dove, e lo fa per te.
Spiegazione completa
L' @Autowired
annotazione ti consente di saltare le configurazioni altrove su cosa iniettare e lo fa solo per te. Supponendo che il tuo pacchetto sia che com.mycompany.movies
devi inserire questo tag nel tuo XML (file di contesto dell'applicazione):
<context:component-scan base-package="com.mycompany.movies" />
Questo tag eseguirà una scansione automatica. Supponendo che ogni classe che deve diventare un bean sia annotata con un'annotazione corretta come @Component
(per un bean semplice) o @Controller
(per un controllo servlet) o @Repository
(per le DAO
classi) e queste classi sono da qualche parte sotto il pacchetto com.mycompany.movies
, Spring troverà tutte queste e creerà un fagiolo per ognuno. Questo viene fatto in 2 scansioni delle classi: la prima volta cerca solo le classi che devono diventare un bean e mappa le iniezioni che deve fare e alla seconda scansione inietta i bean. Ovviamente, puoi definire i tuoi bean nel file XML più tradizionale o con una classe @Configuration (o qualsiasi combinazione dei tre).
L' @Autowired
annotazione dice a Spring dove deve avvenire un'iniezione. Se lo metti su un metodo setMovieFinder
, capisce (tramite il prefisso set
+ l' @Autowired
annotazione) che un bean deve essere iniettato. Nella seconda scansione, Spring cerca un bean di tipo MovieFinder
e, se trova tale bean, lo inietta in questo metodo. Se trova due di questi fagioli otterrai un Exception
. Per evitare il Exception
, puoi usare l' @Qualifier
annotazione e dirgli quale dei due bean iniettare nel modo seguente:
@Qualifier("redBean")
class Red implements Color {
// Class code here
}
@Qualifier("blueBean")
class Blue implements Color {
// Class code here
}
O se preferisci dichiarare i bean nel tuo XML, sarebbe simile a questo:
<bean id="redBean" class="com.mycompany.movies.Red"/>
<bean id="blueBean" class="com.mycompany.movies.Blue"/>
Nella @Autowired
dichiarazione, è inoltre necessario aggiungere il @Qualifier
per indicare quale dei due bean di colore iniettare:
@Autowired
@Qualifier("redBean")
public void setColor(Color color) {
this.color = color;
}
Se non si desidera utilizzare due annotazioni (la @Autowired
e @Qualifier
), è possibile utilizzare @Resource
per combinare queste due:
@Resource(name="redBean")
public void setColor(Color color) {
this.color = color;
}
Il @Resource
(puoi leggere alcuni dati extra a riguardo nel primo commento su questa risposta) ti risparmia l'uso di due annotazioni e invece ne usi solo una.
Aggiungerò solo altri due commenti:
- La buona pratica sarebbe usare
@Inject
invece che @Autowired
perché non è specifico per la primavera e fa parte dello JSR-330
standard .
- Un'altra buona pratica sarebbe quella di mettere il
@Inject
/ @Autowired
su un costruttore invece di un metodo. Se lo metti su un costruttore, puoi validare che i bean iniettati non sono null e falliscono velocemente quando provi ad avviare l'applicazione ed evita un NullPointerException
quando devi effettivamente usare il bean.
Aggiornamento : per completare l'immagine, ho creato una nuova domanda sulla @Configuration
classe.