Ich gehe einige Blogs auf SpringSource durch und in einem der Blogs verwendet der Autor @Inject
und ich nehme an, er kann es auch verwenden @Autowired
.
Hier ist der Code:
@Inject private CustomerOrderService customerOrderService;
Ich bin mir nicht sicher über den Unterschied zwischen @Inject
und @Autowired
und würde es begrüßen, wenn jemand seinen Unterschied erklärt und welchen ich in welcher Situation verwenden soll.
Antworten:
Angenommen, Sie beziehen sich hier auf die
javax.inject.Inject
Anmerkungen.@Inject
ist Teil des in CD EE 6 (JSR-299) eingeführten Java CDI- Standards ( Contexts and Dependency Injection ). Lesen Sie mehr . Spring hat sich dafür entschieden, die Verwendung@Inject
synonym mit eigenen@Autowired
Anmerkungen zu unterstützen.Um Ihre Frage zu beantworten,
@Autowired
ist Spring's eigene Anmerkung.@Inject
ist Teil einer neuen Java-Technologie namens CDI, die einen Standard für die Abhängigkeitsinjektion ähnlich wie Spring definiert. In einer Spring-Anwendung funktionieren die beiden Anmerkungen genauso, wie Spring beschlossen hat, einige JSR-299-Anmerkungen zusätzlich zu ihren eigenen zu unterstützen.quelle
@Inject
handelt sich um ein von CDI (JSR-299) getrenntes JSR (JSR-330).@Inject
JSR-Annotation verwenden möchten, ist es besser, wenn Sie die@Autowired
Codebasis mit Spring DI sperren.@Inject
alleinige Verwendung gewährleistet keine Rahmenunabhängigkeit. Sie müssten auch injizierbare Beans ohne Framework-abhängige Mechanismen wie Spring's@Component
oder deklarierenapplication.xml
, aber verwenden@Named
und@Singleton
auf Klassenebene. Keine Ahnung, ob ein Spring-Projekt heute wirklich solche Bohnen deklariert - ich habe noch nie von einem Projekt gehört, das von Spring nach JEE migriert ist ...Hier ist ein Blog-Beitrag
@Resource
, der@Inject
, und@Autowired
, vergleicht und einen ziemlich umfassenden Job zu machen scheint.Über den Link:
Test 2 und 7, auf die der Autor verweist, sind "Injektion nach Feldname" bzw. "Versuch, eine Bean mit einem schlechten Qualifikationsmerkmal aufzulösen".
Die Schlussfolgerung sollte Ihnen alle Informationen geben, die Sie benötigen.
quelle
Um die Situation zu bewältigen, in der keine Verkabelung vorhanden ist, sind Beans mit dem
@Autowired
required
Attribut auf verfügbarfalse
.Bei Verwendung
@Inject
funktioniert die Provider-Schnittstelle jedoch mit der Bean, was bedeutet, dass die Bean nicht direkt, sondern mit dem Provider injiziert wird.quelle
Ab Frühling 3.0, Frühling bietet Unterstützung für JSR-330 Dependency Injection Anmerkungen (
@Inject
,@Named
,@Singleton
).In der Spring-Dokumentation gibt es einen separaten Abschnitt über sie, einschließlich Vergleiche mit ihren Spring-Äquivalenten.
quelle
Der Hauptunterschied (der beim Lesen der Spring Docs festgestellt wird ) zwischen
@Autowired
und@Inject
besteht darin, dass@Autowired
das Attribut 'erforderlich' vorhanden ist, während das @Inject kein Attribut 'erforderlich' hat.quelle
@Autowired(required=false)
In einfachen Worten: "Dasrequired
Attribut gibt an, dass die Eigenschaft nicht für die automatische Verdrahtung erforderlich ist. Die Eigenschaft wird ignoriert, wenn sie nicht automatisch verdrahtet werden kann."Verwenden Sie besser immer @Inject. Weil es der Java-Konfigurationsansatz (von sun bereitgestellt) ist, der unsere Anwendung unabhängig vom Framework macht. Wenn Sie also Frühling haben, werden auch Ihre Klassen funktionieren.
Wenn Sie @Autowired verwenden, funktioniert dies nur mit spring, da @Autowired eine von Spring bereitgestellte Anmerkung ist.
quelle
@Autowired
Annotation wird im Spring-Framework definiert.@Inject
Annotation ist eine Standard-Annotation, die im Standard "Dependency Injection for Java" (JSR-330) definiert ist . Spring (seit Version 3.0) unterstützt das verallgemeinerte Modell der Abhängigkeitsinjektion, das im Standard JSR-330 definiert ist. ( Google Guice-Frameworks und Picocontainer-Framework unterstützen dieses Modell ebenfalls).Mit
@Inject
kann die Referenz auf die Implementierung derProvider
Schnittstelle eingefügt werden, wodurch die zurückgestellten Referenzen eingefügt werden können.Anmerkungen
@Inject
und@Autowired
- sind fast vollständige Analogien. Sowie@Autowired
Annotation,@Inject
Anmerkung kann für die automatische Bindeeigenschaften, Methoden und Konstruktoren verwendet werden.Im Gegensatz zur
@Autowired
Annotation hat die@Inject
Annotation keinrequired
Attribut. Wenn die Abhängigkeiten nicht gefunden werden, wird daher eine Ausnahme ausgelöst.Es gibt auch Unterschiede in der Klärung der Bindungseigenschaften. Wenn bei der Auswahl der Komponenten für die Injektion Unklarheiten bestehen,
@Named
sollte der Qualifizierer hinzugefügt werden. In einer ähnlichen Situation wird für@Autowired
Annotation ein@Qualifier
Qualifier hinzugefügt (JSR-330 definiert seine eigene@Qualifier
Annotation und über diesen Qualifier wird Annotation@Named
definiert).quelle
@Inject
hat kein 'erforderliches' Attributquelle
Zusätzlich zum oben genannten:
@Autowired
Beans ist Singleton, während die Verwendung der JSR 330-@Inject
Annotation dem Prototyp von Spring ähnelt .@Inject
.@Inject
.quelle
Die
@Inject
Annotation ist eine der JSR-330-Annotationssammlungen. Dies hat Ausführungspfade Match by Type, Match by Qualifier, Match by Name. Diese Ausführungspfade gelten sowohl für die Setter-@Autowired
als auch für die@Inject
Feldinjektion. Das Verhalten der Annotation entspricht dem der Annotation. Der einzige Unterschied besteht darin, dass die@Autowired
Anmerkung Teil des Spring-Frameworks ist.@Autowired
Annotation hat auch die obigen Ausführungspfade. Also empfehle ich das@Autowired
für deine Antwort.quelle