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' @Autowiredannotation 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.moviesvous 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 DAOclasses) 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' @Autowiredannotation indique à Spring où une injection doit avoir lieu. Si vous le placez sur une méthode, setMovieFinderil comprend (par le préfixe set+ l' @Autowiredannotation) qu'un bean doit être injecté. Dans la deuxième analyse, Spring recherche un bean de type MovieFinderet 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' @Qualifierannotation 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 @Autowireddéclaration, vous devez également ajouter le @Qualifierpour 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 @Autowiredet @Qualifier), vous pouvez utiliser @Resourcepour 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
@Injectplace de @Autowiredcar il n'est pas spécifique à Spring et fait partie de la JSR-330norme .
- Une autre bonne pratique serait de mettre le
@Inject/ @Autowiredsur 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 NullPointerExceptionlorsque vous devez réellement utiliser le bean.
Mise à jour : Pour compléter l'image, j'ai créé une nouvelle question sur la @Configurationclasse.