web-dev-qa-db-fra.com

Comment injecter une dépendance Spring par ID?

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?

29
Aaron Digulla

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 ) {
}

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).

69
skaffman