Quelle est la différence entre @Inject et @Autowired dans Spring Framework? Lequel utiliser dans quelle condition?
Je passe en revue certains blogs sur SpringSource et dans l'un des blogs, l'auteur utilise @Inject et je suppose qu'il peut aussi utiliser @Autowired.
, Voici le morceau de code:
@Inject private CustomerOrderService customerOrderService;
Je ne suis pas sûr de la différence entre @Inject et @Autowired et j'apprécierais que quelqu'un explique leur différence et lequel utiliser dans quelle situation?
10 réponses
En supposant ici que vous faites référence à la javax.inject.Inject annotations. @Inject fait partie de la norme Java CDI (Contexts and Dependency Injection) introduite dans Java EE 6 (JSR-299), lire la suite. Spring a choisi de prendre en charge l'utilisation de @Inject synonyme de leur propre annotation @Autowired.
Donc, pour répondre à votre question, @Autowired est la propre annotation (héritée) de Spring. @Inject fait partie d'une nouvelle technologie Java appelée CDI qui définit une norme pour l'injection de dépendance similaire à Printemps. Dans une application Spring, les deux annotations fonctionnent de la même manière que Spring a décidé de prendre en charge certaines annotations JSR-299 en plus des leurs.
Voici un blog, ce qui se compare @Resource, @Inject, et @Autowired, et semble faire un joli globale de l'emploi.
À Partir du lien:
À l'exception des tests 2 et 7, la configuration et les résultats étaient les suivants identique. Quand j'ai regardé sous le capot, j'ai déterminé que l' Les annotations’ @Autowired ‘et’ @Inject ' se comportent de manière identique. Les deux ces annotations utilisent le 'AutowiredAnnotationBeanPostProcessor' pour injecter des dépendances. ‘ @ Autowired ' et '@ Inject ' peuvent être utiliser interchangeables pour injecter des haricots de printemps. Cependant, le ' @ Resource’ annotation utilise le 'CommonAnnotationBeanPostProcessor' pour injecter dépendance. Même s'ils utilisent différentes classes de post processeur ils se comportent tous de façon presque identique. Ci-dessous est un résumé de leurs les chemins d'exécution.
Teste 2 et 7 que les références de l'auteur sont "injection par nom de champ" et "une tentative de résolution d'un bean en utilisant un mauvais qualificateur", respectivement.
La Conclusion devrait vous donner toutes les informations dont vous avez besoin.
Pour gérer la situation dans laquelle il n'y a pas de câblage, les haricots sont disponibles avec @Autowired required attribut false.
Mais lorsque vous utilisez @Inject, l'interface du fournisseur fonctionne avec le bean, ce qui signifie que le bean n'est pas injecté directement mais avec le fournisseur.
Depuis Spring 3.0, Spring prend en charge les annotations d'injection de dépendance JSR-330(@Inject, @Named, @Singleton).
Il y a une section distincte dans la documentation de printemps à leur sujet, y compris des comparaisons avec leurs équivalents de printemps.
@Autowired l'annotation est définie dans le cadre du Printemps.
@Inject l'annotation est une annotation standard, qui est défini dans la norme "l'Injection de Dépendance pour Java" (JSR 330). Spring (depuis la version 3.0) prend en charge le modèle généralisé d'injection de dépendance qui est défini dans la norme JSR-330. ( les frameworks Google Guice et picocontainer framework prennent également en charge Ce modèle).
Avec @Inject peut être injecté de la référence à la implémentation de l'interface Provider, qui permet d'injecter les références différées.
Annotations @Inject et @Autowired - est analogies presque complètes. En plus de l'annotation @Autowired, l'annotation @Inject peut être utilisée pour les propriétés de liaison automatique, les méthodes et les constructeurs.
, contrairement à @Autowired annotation, @Inject annotation n'a pas de required attribut. Par conséquent, si les dépendances ne seront pas trouvés - sera jeté une exception.
Il y a aussi des différences dans le clarifications des propriétés de liaison. En cas d'ambiguïté dans le choix des composants pour l'injection, le qualificatif @Named doit être ajouté. Dans une situation similaire pour @Autowired annotation sera ajouté @Qualifier qualificateur (JSR-330 définit son propre @Qualifier annotation et via ce qualificatif annotation @Named est défini).
Mieux utiliser @Inject tout le temps. Parce que c'est l'approche de configuration java (fournie par sun) qui rend notre application agnostique au framework. Donc, si vous le printemps aussi vos classes fonctionneront.
Si vous utilisez @Autowired, cela ne fonctionnera qu'avec spring car @Autowired est une annotation fournie par spring.
En plus de ce qui précède:
- la portée par défaut pour les beans @Autowired est Singleton alors que l'utilisation de l'annotation JSR 330 @ Inject est comme
prototypede Spring. - il N'y a pas d'équivalent de @ Lazy dans jsr 330 en utilisant @Inject
- il N'y a pas d'équivalent de @ Value dans jsr 330 en utilisant @Inject
L'annotation @Inject fait partie de la collection d'annotations JSR-330. Cela a correspondance par Type, correspondance par qualificateur, correspondance par nom chemins d'exécution.
Ces chemins d'exécution sont valides pour le setter et l'injection de champ.Le comportement de l'annotation @Autowired est identique à celui de l'annotation @Inject. La seule différence est que l'annotation @Autowired fait partie du framework Spring. @Autowired annotation a également les chemins d'exécution ci-dessus. Je recommande donc le @Autowired pour votre réponse.