Question Quelle est la différence entre @Inject et @Autowired dans Spring Framework? Lequel utiliser dans quelles conditions?


Je passe par quelques 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 apprécierait si quelqu'un a expliqué leur différence et lequel utiliser dans quelle situation?


556
2017-08-22 02:30


origine


Réponses:


En supposant ici que vous faites référence à la javax.inject.Inject annotations. @Inject fait partie du Java CDI (Contextes et Injection de Dépendance) standard introduit en Java EE 6 (JSR-299), Lire la suite. Le printemps a choisi de soutenir l'aide @Inject synonyme de leur propre @Autowired annotation.

Donc, pour répondre à votre question, @Autowired est l'annotation propre à Spring (héritage). @Inject fait partie d'une nouvelle technologie Java appelée CDI qui définit un standard pour l'injection de dépendances similaire à Spring. 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 siennes.


588
2017-08-22 07:08



Voici une article de blog qui compare @Resource, @Inject, et @Autowired, et semble faire un travail assez complet.

Du lien:

À l'exception des tests 2 et 7, la configuration et les résultats ont été   identique. Quand j'ai regardé sous le capot, j'ai déterminé que le   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 utilisés   interchangeable pour injecter les haricots de printemps. Cependant, le '@Resource'   l'annotation utilise le 'CommonAnnotationBeanPostProcessor' pour injecter   dépendances. Même s'ils utilisent différentes classes de post-traitement   ils se comportent tous presque de la même manière. Voici un résumé de leur   chemins d'exécution.

Les tests 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 qualificatif», respectivement.

La conclusion devrait vous donner toutes les informations dont vous avez besoin.


141
2017-08-22 05:28



Pour gérer la situation dans laquelle il n'y a pas de câblage, les haricots sont disponibles avec @Autowired  required attribut défini sur false.

Mais en utilisant @Inject, l'interface Provider fonctionne avec le bean, ce qui signifie que le bean n'est pas injecté directement mais avec le fournisseur.


26
2018-01-25 14:27



À partir de Spring 3.0, Spring prend en charge les annotations d'injection de dépendance JSR-330 (@Inject, @Named, @Singleton).

Il y a un section séparée dans la documentation de printemps à leur sujet, y compris des comparaisons avec leurs équivalents de printemps.


22
2017-07-17 09:17



La différence clé (remarquée lors de la lecture du Spring Docs) entre @Autowired et @Inject est-ce, @Autowired a l'attribut 'required' alors que @Inject n'a pas d'attribut 'required'.


17
2017-11-17 09:39



@Inject n'a pas d'attribut 'required'


11
2017-08-19 09:44



@Autowired L'annotation est définie dans le cadre Spring.

@Inject l'annotation est une annotation standard, définie dans la norme "Injection de dépendance pour Java" (JSR-330). Spring (depuis la version 3.0) supporte le modèle généralisé d'injection de dépendances qui est défini dans la norme JSR-330. (Les frameworks Google Guice et Cadre Picocontainer est également soutenir ce modèle).

Avec @Inject peut être injecté la référence à la mise en œuvre de la Provider interface, qui permet d'injecter les références différées.

Annotations @Inject et @Autowired- est des analogies presque complètes. Aussi bien que @Autowired annotation, @Inject L'annotation peut être utilisée pour les propriétés de liaison automatique, les méthodes et les constructeurs.

Contrairement à @Autowired annotation, @Inject l'annotation n'a pas required attribut. Par conséquent, si les dépendances ne seront pas trouvées - sera levée l'exception.

Il existe également des différences dans les clarifications des propriétés de liaison. S'il y a ambiguïté dans le choix des composants pour l'injection, le @Named qualificateur devrait être ajouté. Dans une situation similaire pour @Autowired l'annotation sera ajoutée @Qualifier qualificatif (JSR-330 définit son propre @Qualifier annotation et via cette annotation qualificative @Named est défini).


11
2017-10-08 12:15



Mieux utiliser @Inject tout le temps. Parce que c'est l'approche de configuration de Java (fournie par le soleil) qui rend notre application agnostique au cadre. Donc, si vous venez aussi, vos cours fonctionneront.

Si vous utilisez @Autowired, cela ne fonctionnera qu'avec le ressort car @Autowired est une annotation fournie par le printemps.


11
2017-11-26 17:27



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 JSR 330 @Inject annotation est comme celle de Spring prototype.
  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
2018-06-22 03:39



le @Inject L'annotation fait partie de la collection d'annotations JSR-330. Cela a Match par type, correspondance par qualificateur, correspondance par chemins d'exécution de nom. Ces chemins d'exécution sont valables pour l'injection de setter et de champ. @Autowired l'annotation est la même que @Inject annotation. La seule différence est la @Autowired L'annotation fait partie du framework Spring. @Autowired L'annotation a également les chemins d'exécution ci-dessus. Donc je recommande le @Autowired pour ta réponse.


0
2018-04-11 09:59