Quelle annotation, @Resource ( jsr250 ) ou @Autowired (spécifique à Spring) dois-je utiliser dans DI?
J'ai utilisé avec succès à la fois dans le passé @Resource(name="blah")
et@Autowired @Qualifier("blah")
Mon instinct est de rester avec le @Resource
tag car il a été ratifié par le peuple jsr.
Quelqu'un a des pensées fortes à ce sujet?
Réponses:
Au printemps pré-3.0, peu importe lequel.
Au printemps 3.0, l' annotation standard ( JSR-330 ) est prise en charge
@javax.inject.Inject
- utilisez-la avec une combinaison de@Qualifier
. Notez que Spring prend désormais également en charge la@javax.inject.Qualifier
méta-annotation:Vous pouvez donc avoir
ou
Et alors:
Cela utilise moins les noms de chaîne, qui peuvent être mal orthographiés et sont plus difficiles à maintenir.
Quant à la question d'origine: les deux, sans spécifier d'attributs de l'annotation, effectuent l'injection par type. La différence est:
@Resource
vous permet de spécifier le nom du bean injecté@Autowired
vous permet de le marquer comme non obligatoire.la source
foo
ou d'un constructeurSomeBean
avec unFoo
paramètre?@Resource
et@Autowired
, la réponse réelle est celle publiée par @Ichthyo, je pense que celle-ci doit être mise à jour.Les deux
@Autowired
(ou@Inject
) et@Resource
fonctionnent aussi bien. Mais il y a une différence conceptuelle ou une différence de sens@Resource
signifie me procurer une ressource connue par son nom . Le nom est extrait du nom du setter ou du champ annoté, ou il est extrait du paramètre name.@Inject
ou@Autowired
essayez de câbler un autre composant approprié par type .Donc, fondamentalement, ce sont deux concepts bien distincts. Malheureusement, Spring-Implementation
@Resource
a un repli intégré, qui se déclenche lorsque la résolution par nom échoue. Dans ce cas, il revient au@Autowired
type de résolution -kind. Bien que cette solution de repli soit pratique, à@Resource
mon humble avis , elle provoque beaucoup de confusion, car les gens ne connaissent pas la différence conceptuelle et ont tendance à utiliser pour le câblage automatique basé sur le type.la source
@Resource
champ annoté et que le nom du champ correspond à l'ID d'un bean dans le conteneur, Spring lanceraorg.springframework.beans.factory.BeanNotOfRequiredTypeException
si leurs types diffèrent - c'est parce que les beans sont d'abord mis en correspondance par nom dans l'@Resource
annotation, pas par type. Mais si le nom de la propriété ne correspond pas au nom du bean, Spring les câblera par type.@Autowire
cela ne peut pas et ne fonctionnera pas. Vous devrez utiliser@Resource
dans ce cas.La principale différence
@Autowired
est une annotation de ressort. Alors que@Resource
le JSR-250 le spécifie, comme vous l'avez souligné vous-même. Donc, ce dernier fait partie de Java alors que le premier est spécifique à Spring.Par conséquent, vous avez raison de suggérer cela, dans un sens. J'ai trouvé des gens utilisent
@Autowired
avec ,@Qualifier
car il est plus puissant. Passer d'un cadre à un autre est considéré comme très improbable, sinon mythique, en particulier dans le cas du printemps.la source
@Autowired
avec est@Qualifier
vraiment plus puissant que l' annotation standard JSR (pensez aux dépendances optionnelles par exemple avec . Vous ne pouvez pas le faire avec )@Resource
@Autowired(required=false)
@Resource
Je voudrais souligner un commentaire de @Jules sur cette réponse à cette question. Le commentaire apporte un lien utile: Spring Injection avec @Resource, @Autowired et @Inject . Je vous encourage à le lire entièrement, cependant voici un bref résumé de son utilité:
Comment les annotations sélectionnent la bonne implémentation?
@Autowired
et@Inject
@Resource
Quelles annotations (ou combinaison de) dois-je utiliser pour injecter mes grains?
Nommez explicitement votre composant [@Component ("beanName")]
Utiliser
@Resource
avec l'name
attribut [@Resource (name = "beanName")]Pourquoi ne devrais-je pas utiliser
@Qualifier
?Évitez les
@Qualifier
annotations sauf si vous souhaitez créer une liste de beans similaires. Par exemple, vous souhaiterez peut-être marquer un ensemble de règles avec une@Qualifier
annotation spécifique . Cette approche simplifie l'injection d'un groupe de classes de règles dans une liste qui peut être utilisée pour le traitement des données.L'injection de haricots ralentit-elle mon programme?
Analyser des packages spécifiques pour les composants
[context:component-scan base-package="com.sourceallies.person"]
. Bien que cela se traduise par plus decomponent-scan
configurations, cela réduit les chances que vous ajoutiez des composants inutiles à votre contexte Spring.Référence: Spring Injection avec @Resource, @Autowired et @Inject
la source
Voici ce que j'ai obtenu du manuel de référence Spring 3.0.x : -
la source
@Autowired + @Qualifier ne fonctionnera qu'avec la DI de ressort, si vous souhaitez utiliser une autre DI à l'avenir @Resource est une bonne option.
une autre différence que j'ai trouvée très significative est que @Qualifier ne prend pas en charge le câblage de bean dynamique, car @Qualifier ne prend pas en charge l'espace réservé, tandis que @Resource le fait très bien.
Par exemple: si vous avez une interface avec plusieurs implémentations comme celle-ci
avec @Autowired et @Qualifier, vous devez définir une implémentation enfant spécifique comme
qui ne fournit pas d'espace réservé tandis qu'avec @Resource vous pouvez mettre un espace réservé et utiliser un fichier de propriétés pour injecter une implémentation enfant spécifique comme
où service.name est défini dans le fichier de propriétés comme
J'espère que cela aide quelqu'un :)
la source
Les deux sont tout aussi bons. L'avantage d'utiliser Resource est à l'avenir si vous voulez un autre framework DI autre que Spring, vos changements de code seront beaucoup plus simples. En utilisant Autowired votre code est étroitement couplé avec des ressorts DI.
la source
Lorsque vous effectuez une analyse critique à partir des classes de base de ces deux annotations, vous réalisez les différences suivantes.
@Autowired
utiliseAutowiredAnnotationBeanPostProcessor
pour injecter des dépendances.@Resource
utiliseCommonAnnotationBeanPostProcessor
pour injecter des dépendances.Même s'ils utilisent différentes classes de post-processeur, ils se comportent tous de façon presque identique. Les différences résident essentiellement dans leurs voies d'exécution, que j'ai soulignées ci-dessous.
1. correspondances par type
2. restrictions par qualificatifs
3. correspondances par nom
1. correspondances par nom
2. correspondances par type
3. restrictions par qualificatifs (ignoré si une correspondance est trouvée par nom)
la source
Avec
@Resource
vous pouvez faire l'auto-injection de bean, cela peut être nécessaire pour exécuter toute la logique supplémentaire ajoutée par les post-processeurs de bean comme les transactions ou les choses liées à la sécurité.Avec Spring 4.3+
@Autowired
est également capable de le faire.la source
@Resource
est souvent utilisé par des objets de haut niveau, définis via JNDI.@Autowired
ou@Inject
sera utilisé par des haricots plus courants.Pour autant que je sache, ce n'est pas une spécification, ni même une convention. C'est plus la façon logique dont le code standard utilisera ces annotations.
la source
Comme une note ici:
SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext
etSpringBeanAutowiringSupport.processInjectionBasedOnServletContext
NE FONCTIONNE PAS avec l'@Resource
annotation. Donc, il y a une différence.la source