L' @Autowired
d'annotation vous permet de passer des configurations d'ailleurs de quoi injecter et juste fait pour vous. En supposant que votre paquet est - com.mycompany.movies
vous devez mettre cette balise xml (contexte d'application fichier):
<context:component-scan base-package="com.mycompany.movies" />
Cette balise va faire un scan automatique. En supposant que chaque classe doit devenir un bean est annoté avec une annotation correcte comme @Component
(pour de simples haricots) ou @Controller
(pour un servlet contrôle) ou en @Repository
( DAO
des classes) et ces catégories sont quelque part dans le paquet com.mycompany.movies
, printemps trouverez tous les de ces et de créer un bean pour chacun. Ceci est fait en 2 scans des classes - la première fois, elle fouille pour les classes qui en ont besoin pour devenir un haricot et les cartes, les injections, il doit être en train de faire, et sur la deuxième analyse, il injecte les haricots. Bien sûr, vous pouvez définir vos haricots dans les plus traditionnels de fichier XML ou avec un @de Configuration de la classe (ou une combinaison des trois).
L' @Autowired
d'annotation indique le printemps, où l'injection doit se produire. Si vous le mettez sur une méthode setMovieFinder
il comprend (par le préfixe set
+ @Autowired
d'annotation) qu'un bean doit être injectée. Dans le deuxième scan printemps recherches pour un bean de type MovieFinder
, s'il en trouve la fève, il injecte à cette méthode. S'il en trouve 2, par exemple les haricots que vous obtenez une exception. Afin d'éviter l'exception que vous pouvez utiliser l' @Qualifier
d'annotation et de dire lequel des 2 haricots à 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 haricots dans votre xml, il ressemblerait à quelque chose comme ceci:
<bean id="redBean" class="com.mycompany.movies.Red"/>
<bean id="blueBean" class="com.mycompany.movies.Blue"/>
Dans l' @Autowire
déclaration, vous devez également ajouter l' @Qualifier
afin de déterminer lequel des 2 couleurs de haricots à injecter:
@Autowired
@Qualifier("redBean")
public void setColor(Color Color) {
this.color = color;
}
Si vous ne voulez pas utiliser de 2 notes ( @Autowired
et @Qualifier
) vous pouvez utiliser @Resource
de combiner ces 2:
@Resource(name="redBean")
public void setColor(Color Color) {
this.color = color;
}
L' @Resource
(vous pouvez lire quelques données supplémentaires à ce sujet dans le 5ème commentaire sur cette réponse) vous épargne l'utilisation de 2 annotations et au lieu d'une seule.
Je vais juste ajouter 2 commentaires:
- Une bonne pratique serait d'utiliser
@Inject
au lieu de @Autowired
parce que c'est pas le printemps-spécifique et fait partie de l' JSR-330
la norme. Vous pouvez lire à ce sujet ici
- Une autre bonne pratique serait de mettre la
@Inject
/ @Autowired
sur un constructeur au lieu d'une méthode. Si vous le mettez sur un constructeur, printemps valide ces bean existe avant l'injection. Dans la méthode de la façon dont il injecte la valeur null si il ne peut pas trouver la fève vous avez besoin de ce qui va provoquer un NullPointerException
lorsque vous essayez d'utiliser cette fève au lieu d'un descriptif exception de la première fois que vous démarrez votre application.
Donc, pour résumer: L' @Autowired
d'annotation vous épargne la nécessité de faire le câblage par vous-même dans le fichier XML (ou autre) et trouve qu'il est pour vous ce qui doit être injecté où, et le fait pour vous.
Mise à jour: Pour remplir l'image, j'ai créé une nouvelle question à propos de @Configuration
classe