TL; DR
L'annotation @Autowired vous épargne le besoin de faire le câblage par vous-même dans le fichier XML (ou de toute autre manière) et trouve juste pour vous ce qui doit être injecté où, et le fait pour vous.
Explication complète
L' @Autowired
annotation vous permet d'ignorer les configurations ailleurs de quoi injecter et le fait juste pour vous. En supposant que votre package est que com.mycompany.movies
vous devez mettre cette balise dans votre XML (fichier de contexte d'application):
<context:component-scan base-package="com.mycompany.movies" />
Cette balise effectuera une analyse automatique. En supposant que chaque classe qui doit devenir un bean est annotée avec une annotation correcte comme @Component
(pour le bean simple) ou @Controller
(pour un contrôle de servlet) ou @Repository
(pour les DAO
classes) et ces classes sont quelque part sous le package com.mycompany.movies
, Spring les trouvera toutes et créera un haricot pour chacun. Cela se fait en 2 scans des classes - la première fois, il recherche juste les classes qui doivent devenir un bean et mappe les injections qu'il doit faire, et lors du deuxième scan il injecte les beans. Bien sûr, vous pouvez définir vos beans dans le fichier XML plus traditionnel ou avec une classe @Configuration (ou une combinaison des trois).
L' @Autowired
annotation indique à Spring où une injection doit avoir lieu. Si vous le placez sur une méthode, setMovieFinder
il comprend (par le préfixe set
+ l' @Autowired
annotation) qu'un bean doit être injecté. Dans la deuxième analyse, Spring recherche un bean de type MovieFinder
et s'il trouve un tel bean, il l'injecte à cette méthode. S'il trouve deux de ces beans, vous obtiendrez un Exception
. Pour éviter cela Exception
, vous pouvez utiliser l' @Qualifier
annotation et lui indiquer lequel des deux beans injecter de la manière suivante:
@Qualifier("redBean")
class Red implements Color {
// Class code here
}
@Qualifier("blueBean")
class Blue implements Color {
// Class code here
}
Ou si vous préférez déclarer les beans dans votre XML, cela ressemblerait à ceci:
<bean id="redBean" class="com.mycompany.movies.Red"/>
<bean id="blueBean" class="com.mycompany.movies.Blue"/>
Dans la @Autowired
déclaration, vous devez également ajouter le @Qualifier
pour indiquer lequel des deux grains de couleur injecter:
@Autowired
@Qualifier("redBean")
public void setColor(Color color) {
this.color = color;
}
Si vous ne souhaitez pas utiliser deux annotations (le @Autowired
et @Qualifier
), vous pouvez utiliser @Resource
pour combiner ces deux:
@Resource(name="redBean")
public void setColor(Color color) {
this.color = color;
}
Le @Resource
(vous pouvez lire quelques données supplémentaires à ce sujet dans le premier commentaire sur cette réponse) vous épargne l'utilisation de deux annotations et à la place vous n'en utilisez qu'une.
Je vais juste ajouter deux autres commentaires:
- La bonne pratique serait d'utiliser à la
@Inject
place de @Autowired
car il n'est pas spécifique à Spring et fait partie de la JSR-330
norme .
- Une autre bonne pratique serait de mettre le
@Inject
/ @Autowired
sur un constructeur au lieu d'une méthode. Si vous le placez sur un constructeur, vous pouvez valider que les beans injectés ne sont pas nuls et échouent rapidement lorsque vous essayez de démarrer l'application et en éviter un NullPointerException
lorsque vous devez réellement utiliser le bean.
Mise à jour : Pour compléter l'image, j'ai créé une nouvelle question sur la @Configuration
classe.