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?
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.
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.
Pour gérer la situation dans laquelle il n'y a pas de câblage, les beans sont disponibles avec l'attribut @Autowired
required
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.
À 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.
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'.
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.
@Inject
n'a pas d'attribut 'obligatoire'
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).
En plus de ce qui précède:
prototype
".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.