Je passe par 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
j'apprécierais que quelqu'un explique sa différence et laquelle utiliser dans quelle situation?
Réponses:
En supposant ici que vous faites référence aux
javax.inject.Inject
annotations.@Inject
fait partie de la norme Java CDI ( Contexts and Dependency Injection ) introduite dans Java EE 6 (JSR-299), en savoir plus . Spring a choisi de soutenir l'utilisation@Inject
synonyme de leur propre@Autowired
annotation.Donc, pour répondre à votre question,
@Autowired
c'est la propre annotation de Spring.@Inject
fait partie d'une nouvelle technologie Java appelée CDI qui définit une norme d'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 leurs.la source
@Inject
est un JSR (JSR-330) distinct du CDI (JSR-299).@Inject
utiliser l'annotation JSR est préférable à l'utilisation@Autowired
qui verrouille votre base de code avec Spring DI.@Inject
seule ne garantit pas l'indépendance du framework. Vous devez également déclarer des beans injectables sans mécanismes dépendants du framework comme Spring@Component
ou orapplication.xml
, mais utilisez@Named
et@Singleton
au niveau de la classe. Aucune idée si un projet Spring déclare vraiment des haricots comme ça aujourd'hui - je n'ai même jamais entendu parler d'un projet qui a migré de Spring vers JEE ...Voici un article de blog qui compare
@Resource
,@Inject
et@Autowired
, et semble faire un travail assez complet.Depuis le lien:
Tests 2 et 7 auxquels l'auteur fait référence respectivement «injection par nom de champ» et «tentative de résolution d'un bean en utilisant un mauvais qualificatif».
La conclusion devrait vous donner toutes les informations dont vous avez besoin.
la source
Pour gérer la situation dans laquelle il n'y a pas de câblage, les beans sont disponibles avec l'
@Autowired
required
attribut défini surfalse
.Mais lors de l'utilisation
@Inject
, l'interface du fournisseur fonctionne avec le bean, ce qui signifie que le bean n'est pas injecté directement mais avec le fournisseur.la source
À partir du printemps 3.0, offres de printemps pour soutenir JSR-330 annotations d'injection de dépendance (
@Inject
,@Named
,@Singleton
).Il existe une section distincte dans la documentation Spring à leur sujet, y compris des comparaisons avec leurs équivalents Spring.
la source
La principale différence (remarquée lors de la lecture des documents Spring ) entre
@Autowired
et@Inject
est que,@Autowired
a l'attribut «requis» tandis que @Inject n'a pas d'attribut «requis».la source
@Autowired(required=false)
:. En termes simples, "L'required
attribut indique que la propriété n'est pas requise à des fins de câblage automatique, la propriété est ignorée si elle ne peut pas être câblée automatiquement."Mieux utiliser @Inject tout le temps. Parce que c'est l'approche de configuration java (fournie par sun) qui rend notre application indépendante du framework. Donc, si vous ressortez aussi, vos cours fonctionneront.
Si vous utilisez @Autowired, cela ne fonctionnera qu'avec le ressort car @Autowired est une annotation fournie par le ressort.
la source
@Autowired
l'annotation est définie dans le framework Spring.@Inject
annotation est une annotation standard, qui est définie dans le standard "Dependency Injection for Java" (JSR-330) . Spring (depuis la version 3.0) prend en charge 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 Picocontainer prennent également en charge ce modèle).Avec
@Inject
peut être injecté la référence à l'implémentation de l'Provider
interface, ce qui permet d'injecter les références différées.Les annotations
@Inject
et@Autowired
- sont des analogies presque complètes. Outre l'@Autowired
annotation, l'@Inject
annotation peut être utilisée pour les propriétés de liaison automatique, les méthodes et les constructeurs.Contrairement à l'
@Autowired
annotation, l'@Inject
annotation n'a pas d'required
attribut. Par conséquent, si les dépendances ne sont pas trouvées, une exception sera levée.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
qualificatif doit être ajouté. Dans une situation similaire pour l'@Autowired
annotation sera ajouté un@Qualifier
qualificatif (JSR-330 définit sa propre@Qualifier
annotation et via cette annotation qualificative@Named
est définie).la source
@Inject
n'a pas d'attribut «requis»la source
En plus de ce qui précède:
@Autowired
beans est Singleton alors qu'en utilisant l'@Inject
annotation JSR 330, c'est comme le prototype de Spring .@Inject
.@Inject
.la source
L'
@Inject
annotation fait partie de la collection d'annotations JSR-330. Il s'agit des chemins d'exécution Correspondance par type, Correspondance par qualificatif, Correspondance par nom. Ces chemins d'exécution sont valables pour l'injection de setter et de champ. Le comportement de l'@Autowired
annotation est le même que celui de l'@Inject
annotation. La seule différence est que l'@Autowired
annotation fait partie du framework Spring.@Autowired
l'annotation a également les chemins d'exécution ci-dessus. Je recommande donc le@Autowired
pour votre réponse.la source