421 votes

@Resource vs @Autowired

Quelle annotation, @Resource ( jsr250 ) ou @Autowired (Spring specific) dois-je utiliser lors de l'utilisation de DI?

J'ai utilisé avec succès les deux dans le passé, @Resource(name="blah") et @Autowired @Qualifier("blah")

mon instinct est de rester avec le tag @Resource car il a été ratifié par les gens de jsr ... quelqu'un a des pensées fortes à ce sujet?

(Excuses si cette question a déjà été posée, je n'ai pas pu la trouver ...)

550voto

Ichthyo Points 1760

@Autocâblés (ou @Inject) et @Resource fonctionner tout aussi bien. Mais il existe une différence conceptuelle ou une différence dans le sens

  • @Resource moyen d'obtenir de moi une ressource connue par son nom. Le nom est extrait à partir du nom de la annoté setter ou d'un champ, ou il est tiré du nom du Paramètre.
  • @Inject ou @Autowired essayez de fil dans un adapté à d'autres composants par type.

Donc, fondamentalement, ce sont deux concepts distincts. Malheureusement, le Printemps de la mise en Œuvre de l' @Resource a intégré de secours, qui débute lors de la résolution de nom échoue. Dans ce cas, il revient à l' @Autowired-type de résolution par type. Bien que cette solution de repli est pratique, à mon humble avis, il provoque beaucoup de confusion, parce que les gens ne sont pas conscients de la différence conceptuelle et ont tendance à utiliser @Resource pour le type de base permettra à l'autowiring.

210voto

Bozho Points 273663

Au printemps pré-3.0 n'a pas d'importance.

Au printemps 3.0 il y a le support pour la norme (JSR 330) annotation @javax.inject.Inject - utiliser, avec une combinaison de @Qualifier. Notez que le printemps prend également en charge l' @javax.inject.Qualifier méta-annotation:

@Qualifier
@Retention(RUNTIME)
public @interface YourQualifier {}

De sorte que vous pouvez avoir

<bean class="com.pkg.SomeBean">
   <qualifier type="YourQualifier"/>
</bean>

ou

@YourQualifier
@Component
public class SomeBean implements Foo { .. }

Et puis:

@Inject @YourQualifier private Foo foo;

Cela fait moins d'utiliser des Cordes-les noms, qui peuvent être mal orthographié et sont plus difficile à maintenir.


Comme pour la question de départ: à la fois, sans spécifier les attributs de l'annotation, effectuer l'injection par type. La différence est:

  • @Resource vous permet de spécifier un nom de bean injecté
  • @Autowired vous permet de marquer comme non-obligatoire.

83voto

Adeel Ansari Points 24434

La principale différence est, @Autowired est un ressort d'annotation. Alors qu' @Resource est spécifié par la JSR-250, comme vous l'avez souligné vous-même. Celui-ci fait partie de Java alors que le premier est le Printemps spécifiques.

Donc, vous avez raison dans ce qui suggère que, dans un sens. J'ai trouvé des gens utilisent @Autowired avec @Qualifier , car il est plus puissant. Le déplacement de certains cadres à une autre est considérée comme peu probable, si ce n'est le mythe, en particulier dans le cas du Printemps.

74voto

Stephan Points 10596

Je voudrais souligner un commentaire de @Jules sur cette réponse à cette question. Le commentaire apporte un lien utile: Printemps Injection avec @Resource, @Autocâblés et @Inject. Je vous encourage à le lire entièrement, cependant voici un rapide résumé de son utilité:

Comment les annotations de sélectionner la bonne mise en œuvre?

@Autowired et @Inject

  1. Correspondances par Type
  2. Restreint par des Qualificatifs
  3. Correspondances par Nom

@Resource

  1. Correspondances par Nom
  2. Correspondances par Type
  3. Restreint par des Qualificatifs (ignoré si le match est trouvé par nom)

Les annotations (ou une combinaison de) dois-je utiliser pour l'injection de mes haricots?

  1. Explicitement le nom de votre composant [@Component("beanName")]

  2. Utiliser @Resource avec l' name de l'attribut [@Resource(name="beanName")]

Pourquoi devrais-je pas utiliser @Qualifier?

Évitez @Qualifier annotations sauf si vous voulez créer une liste des autres haricots. Par exemple, vous pouvez marquer un ensemble de règles spécifiques, @Qualifier d'annotation. Cette approche rend simple d'injecter un groupe de la règle des classes dans une liste qui peut être utilisé pour le traitement des données.

Ne haricot injection lente de mon programme?

Analyse des paquets spécifiques pour les composants [context:component-scan base-package="com.sourceallies.person"]. Tout cela se traduira par plus de component-scan configurations réduit les chances que vous allez ajouter des composants inutiles de votre Ressort du contexte.


Référence: Printemps Injection avec @Resource, @Autocâblés et @Inject

39voto

Kartik Points 131

C'est ce que j'ai obtenu à partir du Printemps 3.0.x Manuel de Référence :-

Astuce

Si vous avez l'intention d'exprimer annotation-driven injection par nom, ne surtout pas utiliser @Autocâblés, même si c'est techniquement capable de se référant à un haricot nom via @valeurs qualifiées. Au lieu de cela, utiliser le JSR 250 @annotation de Ressources, ce qui est sémantiquement défini à identifier un composant cible par son nom unique, avec l' type déclaré être sans importance pour le processus d'appariement.

Comme conséquence de cette différence sémantique, les fèves, qui sont eux-mêmes définis comme une collection ou le type de carte ne peut pas être injecté via @Autocâblés, parce que le type de correspondance n'est pas correctement applicable pour eux. Utiliser @Ressource haricots, se référant à la spécifique la collecte ou la carte de haricot par un nom unique.

@Autocâblés s'applique à des champs, constructeurs et multi-argument les méthodes permettant de réduire par le biais de qualifier les annotations à l' paramètre niveau. En revanche, @des Ressources est pris en charge uniquement pour les champs et de haricots de la propriété setter avec un seul argument. En tant que conséquence, bâton avec des qualificatifs si votre cible est une injection constructeur ou un multi-argument de la méthode.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X