it-swarm.com.de

Was ist der Unterschied zwischen @Inject und @Autowired in Spring Framework? Welches unter welchen Bedingungen verwenden?

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?

637
Rachel

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.

670
pap

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.

151

Um die Situation zu bewältigen, in der keine Verkabelung vorhanden ist, sind Beans mit dem @Autowiredrequired-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.

32
amits

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.

24

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'.

21
Lucky

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.

14
tech.yenduri

@Inject hat kein 'erforderliches' Attribut

12

@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).

12
Aleksey Bykov

Zusätzlich zum oben genannten:

  1. Der Standardbereich für @Autowired-Beans ist Singleton, wohingegen die Verwendung der @Inject-Annotation von JSR 330 dem prototype von Spring gleicht.
  2. Es gibt kein Äquivalent zu @Lazy in JSR 330, das @Inject verwendet
  3. Es gibt kein Äquivalent zu @Value in JSR 330, das @Inject verwendet
9
Keyur Vyas

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.

0
Kushani5j