J'ai plusieurs beans avec le même type (BeanType
). Comment les injecter par ID avec une annotation? Dire:
@Autowired @ID("bean1")
public void setBean( BeanType bean ) {
}
Mais il n'y a pas d'annotation @ID
.
J'ai seulement trouvé @Qualifier
ce qui signifierait que je devrais donner tous mes ID de beans et qualificatifs. Certes, il existe un moyen plus simple?
La solution la plus simple consiste à utiliser @Resource
@Resource(name="bean1")
public void setBean( BeanType bean ) {
}
Par ailleurs, @Qualifier
est utilisé pour faire référence aux beans par ID à utiliser avec @Autowired
, par exemple
@Autowired @Qualifier("bean1")
public void setBean( BeanType bean ) {
}
où bean1
est l'ID du bean à injecter.
Voir le manuel Spring :
Pour une correspondance de secours, le nom du bean est considéré comme une valeur de qualificateur par défaut. Ainsi, vous pouvez définir le bean avec un id "main" au lieu de l'élément qualificatif imbriqué, conduisant au même résultat correspondant. Cependant, bien que vous puissiez utiliser cette convention pour faire référence à des beans spécifiques par leur nom,
@Autowired
concerne fondamentalement l'injection pilotée par type avec des qualificatifs sémantiques facultatifs. Cela signifie que les valeurs de qualificatif, même avec le repli du nom du bean, ont toujours une sémantique plus étroite dans l'ensemble des correspondances de type; ils n'expriment pas sémantiquement une référence à un identifiant de bean unique.
et
Si vous avez l'intention d'exprimer une injection basée sur des annotations par son nom, n'utilisez pas principalement
@Autowired
, même s'il est techniquement capable de faire référence à un nom de bean via@Qualifier
valeurs. Utilisez plutôt le JSR-250@Resource
annotation, qui est définie sémantiquement pour identifier un composant cible spécifique par son nom unique, le type déclaré n'étant pas pertinent pour le processus de correspondance.
Je préfère @Resource
, c'est plus propre (et pas spécifique à Spring).