web-dev-qa-db-fra.com

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

Je suis en train de parcourir quelques blogs sur SpringSource et dans l'un des blogs, l'auteur utilise @Inject et je suppose qu'il peut également 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 l'apprécierais si quelqu'un expliquait sa différence et lequel utiliser dans quelle situation?

637
Rachel

En supposant que vous vous référiez ici aux javax.inject.Inject . _@Inject_ fait partie de la norme Java CDI ( Injections de contextes et de dépendances ) introduite dans Java EE 6 (JSR-299), - en savoir plus . Spring a choisi de prendre en charge l'utilisation de _@Inject_ synonyme avec sa 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 un standard d'injection de dépendance 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 leurs.

670
pap

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

À partir du lien:

À l'exception des tests 2 et 7, la configuration et les résultats étaient identiques. Lorsque j’ai regardé sous le capot, j’ai constaté que les annotations "@Autowired" et "@Inject" se comportaient de manière identique. Ces deux annotations utilisent ‘AutowiredAnnotationBeanPostProcessor 'pour injecter des dépendances. "@Autowired" et "@Inject" peuvent être utilisés de manière interchangeable pour injecter des haricots du printemps. Toutefois, l’annotation "@Resource" utilise "CommonAnnotationBeanPostProcessor" pour injecter des dépendances. Même s'ils utilisent différentes classes de post-processeurs, ils se comportent tous de manière presque identique. Vous trouverez ci-dessous un résumé de leurs chemins d’exécution.

Les tests 2 et 7 auxquels l'auteur fait référence sont respectivement "injection par nom de champ" et "tentative de résolution d'un bean à l'aide d'un qualificateur incorrect".

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

151
nicholas.hauschild

Pour gérer la situation dans laquelle il n'y a pas de câblage, les beans sont disponibles avec l'attribut @Autowiredrequired défini sur 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.

32
amits

À 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 Spring à leur sujet, y compris des comparaisons avec leurs équivalents Spring.

24
Andre Steingress

La principale différence (constatée lors de la lecture du Spring Docs ) entre @Autowired et @Inject est que, @Autowired possède l'attribut 'requis', tandis que @Inject n'a pas Attribut 'obligatoire'.

21
Lucky

Mieux vaut utiliser @Inject tout le temps. Parce que c’est la méthode de configuration Java (fournie par Sun) qui rend notre application indépendante du cadre de travail. Donc, si vous êtes au printemps, vos cours fonctionneront également.

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

14
tech.yenduri

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

12
Mykhaylo Adamovych

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

L'annotation @Inject est une annotation standard définie dans la norme "Injection de dépendances pour Java" (JSR-330) . Spring (depuis la version 3.0) prend en charge le modèle généralisé d’injection de dépendance défini dans la norme JSR-330. ( cadres de Google Guice et cadre de Picocontainer prennent également en charge ce modèle).

Avec @Inject on peut injecter la référence à la mise en oeuvre de l'interface Provider, ce qui permet d'injecter les références différées.

Les annotations @Inject et @Autowired- sont des 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 à l'annotation @Autowired, l'annotation @Inject n'a pas d'attribut required. Par conséquent, si les dépendances ne seront pas trouvées, une exception sera levée.

Il existe également des différences dans les 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, une annotation sera ajoutée au qualificateur @Qualifier (le JSR-330 définit sa propre annotation @Qualifier et via ce qualificateur, l'annotation @Named est définie).

12
Aleksey Bykov

En plus de ce qui précède:

  1. La portée par défaut des beans @Autowired est Singleton, tandis que l’utilisation de l’annotation JSR 330 @Inject est semblable à celle de Spring (prototype ".
  2. Il n'y a pas d'équivalent de @Lazy dans la JSR 330 avec @Inject.
  3. Il n’existe pas d’équivalent de @Value dans JSR 330 avec @Inject.
9
Keyur Vyas

L'annotation @Inject fait partie de la collection d'annotations JSR-330. Ceci a les chemins d'exécution Match by Type, Match by Qualifier, Match by Name. Ces chemins d'exécution sont valables pour l'injection de setter et 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 cadre Spring. L'annotation @Autowired a également les chemins d'exécution ci-dessus. Je recommande donc le @Autowired pour votre réponse.

0
Kushani5j