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?

573
demandé sur Mahozad 2011-08-22 06:30:42

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.

601
répondu pap 2016-01-11 18:06:01

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.

142
répondu nicholas.hauschild 2011-08-22 05:28:37

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.

26
répondu amits 2013-05-29 02:29:11

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.

22
répondu Andre Steingress 2015-04-27 12:10:13

La différence clé(remarquée lors de la lecture des documents Spring) entre @Autowired et @Inject est que @Autowired a l'attribut 'required' tandis que @Inject n'a pas d'attribut 'required'.

18
répondu Lucky 2018-05-18 12:47:01

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

12
répondu Aleksey Bykov 2018-08-26 14:20:23

@Inject n'a pas de "requis" attribut

11
répondu Mykhaylo Adamovych 2015-04-27 12:10:49

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.

11
répondu tech.yenduri 2015-11-26 17:27:37

En plus de ce qui précède:

  1. 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.
  2. il N'y a pas d'équivalent de @ Lazy dans jsr 330 en utilisant @Inject
  3. il N'y a pas d'équivalent de @ Value dans jsr 330 en utilisant @Inject
9
répondu Keyur Vyas 2015-06-22 04:22:03

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.

0
répondu Kushani Jayawardane 2018-04-11 10:47:31