Ich gehe einige Blogs auf SpringSource durch und in einem der Blogs verwendet der Autor @Inject
und ich nehme an, er kann auch @Autowired
verwenden.
Hier ist der Code:
@Inject private CustomerOrderService customerOrderService;
Ich bin mir über den Unterschied zwischen @Inject
und @Autowired
nicht sicher und würde es begrüßen, wenn jemand seinen Unterschied erklärt und welchen ich unter welchen Umständen verwenden könnte?
Angenommen, Sie beziehen sich hier auf die Anmerkungen javax.inject.Inject
. _@Inject
_ ist Teil des Standards Java CDI ( Contexts and Dependency Injection ), der in Java EE 6 (JSR-299), - eingeführt wurde. lesen Sie mehr . Spring hat sich dafür entschieden, _@Inject
_ synonym mit seiner eigenen _@Autowired
_ Annotation zu verwenden.
Um Ihre Frage zu beantworten: _@Autowired
_ ist Frühlings eigene Annotation (Legacy-Annotation). _@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 Annotationen auf dieselbe Weise, wie Spring beschlossen hat, einige JSR-299-Annotationen zusätzlich zu ihren eigenen zu unterstützen.
Hier ist ein Blog-Beitrag , der @Resource
, @Inject
und @Autowired
vergleicht und einen ziemlich umfassenden Job zu machen scheint.
Über den Link:
Mit Ausnahme von Test 2 und 7 waren Konfiguration und Ergebnisse identisch. Als ich unter die Haube schaute, stellte ich fest, dass sich die Annotation "@Autowired" und "@Inject" identisch verhalten. Beide Annotationen verwenden den "AutowiredAnnotationBeanPostProcessor", um Abhängigkeiten einzufügen. "@Autowired" und "@Inject" können austauschbar zum Injizieren von Springbohnen verwendet werden. Die Annotation "@Resource" verwendet jedoch den "CommonAnnotationBeanPostProcessor", um Abhängigkeiten einzufügen. Obwohl sie unterschiedliche Postprozessor-Klassen verwenden, verhalten sich alle nahezu identisch. Unten finden Sie eine Zusammenfassung ihrer Ausführungspfade.
Tests 2 und 7, auf die der Autor verweist, lauten "Injection by Field Name" bzw. "Versuch, eine Bean mit einem schlechten Qualifier aufzulösen".
Der Abschluss sollte Ihnen alle Informationen geben, die Sie benötigen.
Um die Situation zu bewältigen, in der keine Verkabelung vorhanden ist, sind Beans mit dem @Autowired
required
-Attribut auf false
verfügbar.
Bei Verwendung von @Inject
funktioniert die Provider-Schnittstelle jedoch mit dem Bean, was bedeutet, dass das Bean nicht direkt, sondern mit dem Provider injiziert wird.
Ab Spring 3.0 bietet Spring Unterstützung für JSR-330-Abhängigkeitsinjektionsanmerkungen (@Inject
, @Named
, @Singleton
).
Es gibt ein separater Abschnitt in der Spring-Dokumentation über sie, einschließlich Vergleiche mit ihren Spring-Entsprechungen.
Der Hauptunterschied (beim Lesen des Spring Docs ) zwischen @Autowired
und @Inject
besteht darin, dass @Autowired
das Attribut 'Erforderlich' hat, während das @Inject-Attribut Nr Attribut 'Erforderlich'.
Besser immer @Inject verwenden. Weil es der Java - Konfigurationsansatz (von Sun bereitgestellt) ist, der unsere Anwendung für das Framework unabhängig macht. Wenn du also springst, werden auch deine Klassen funktionieren.
Wenn Sie @Autowired verwenden, funktioniert dies nur mit spring, da @Autowired eine von spring bereitgestellte Annotation ist.
@Inject
hat kein 'erforderliches' Attribut
@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 auch dieses Modell).
Mit @Inject
kann der Verweis auf die Implementierung der Schnittstelle Provider
eingefügt werden, die das Einfügen der zurückgestellten Verweise ermöglicht.
Anmerkungen @Inject
und @Autowired
- sind fast vollständige Analogien. Neben der Annotation @Autowired
kann die Annotation @Inject
für automatische Bindungseigenschaften, Methoden und Konstruktoren verwendet werden.
Im Gegensatz zur Anmerkung @Autowired
hat die Anmerkung @Inject
kein Attribut required
. Daher, wenn die Abhängigkeiten nicht gefunden werden - wird eine Ausnahme ausgelöst.
Unterschiede bestehen auch in der Klärung der Bindungseigenschaften. Wenn die Auswahl der Komponenten für die Injektion nicht eindeutig ist, sollte das Qualifikationsmerkmal @Named
hinzugefügt werden. In einer ähnlichen Situation wird für @Autowired
Annotation @Qualifier
Qualifier hinzugefügt (JSR-330 definiert seine eigene @Qualifier
Annotation und über diese Qualifier Annotation @Named
wird definiert).
Zusätzlich zum oben genannten:
prototype
von Spring gleicht.Die Annotation @Inject
ist eine der Annotationssammlungen des Typs JSR-330. Dies hat Match by Type, Match by Qualifier, Match by Name-Ausführungspfade. Diese Ausführungspfade gelten sowohl für Setter- als auch für Feldinjektion. Das Verhalten der Annotation @Autowired
ist dasselbe wie das der Annotation @Inject
. Der einzige Unterschied ist, dass die Annotation @Autowired
Teil des Spring-Frameworks ist. @Autowired
Annotation hat auch die oben genannten Ausführungspfade. Also empfehle ich den @Autowired
als Antwort.