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
prototype
de 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.