it-swarm.com.de

Injizieren und Ressourcen- und Autowired-Anmerkungen

Was ist der Unterschied zwischen @Inject und @Resource und @Autowired Anmerkungen?

Wann sollten wir jeden von ihnen verwenden?

61
oxygenan

Der Unterschied zwischen @Inject vs. @Autowire vs. @Resource?

@ Autowired: Spring Propriety Annotation (im Gegensatz zu @Inject und @Resource), die eine Ressource nach Typ injiziert, d. H. Nach der Klasse von durch die Schnittstelle des annotierten Felds oder Auftragnehmers. Wenn nur wenige Interfaces oder Unterklassen implementiert sind, können Sie die Auswahl mithilfe der @Qualifier-Annotation eingrenzen, um Mehrdeutigkeiten zu vermeiden. Bei einer Fallback-Übereinstimmung wird der Bean-Name als Standardqualifikationswert betrachtet. Obwohl Sie diese Konvention verwenden können, um bestimmte Beans namentlich zu referenzieren, geht es bei @Autowired im Wesentlichen um typgesteuerte Injection mit optionalen semantischen Qualifizierern.

@ Inject: Auf JSR-330 (Dependency Injection for Java) basierende Annotation identifiziert injizierbare Konstruktoren, Methoden und Felder. Diese Anmerkung ist ein fast vollständiger Ersatz für die @Autowired-Anmerkung von Spring. Daher können Sie anstelle der frühlingsspezifischen @Autowired-Annotation auch @Inject verwenden. Einer der Unterschiede zwischen @Autowired und @Inject besteht darin, dass @Inject nicht über das erforderliche Feld verfügt. Wenn wir also kein geeignetes Objekt zum Injizieren finden, schlägt dies fehl, während @Autowired required = false verwenden kann und ein nullfähiges Feld zulässt (nur) Falls erforderlich!). Der Vorteil von @Inject-Annotationen besteht darin, dass Sie @Inject bitten können, einen Provider einzuspeisen, anstatt eine Referenz direkt einzuspeisen. Die Provider-Schnittstelle ermöglicht unter anderem das verzögerte Einfügen von Bean-Referenzen und das Einfügen mehrerer Instanzen eines Beans. Wenn nur wenige Interfaces oder Unterklassen implementiert sind, können Sie die Auswahl mithilfe der Annotation @Named eingrenzen, um Mehrdeutigkeiten zu vermeiden. @Named Annotation funktioniert ähnlich wie Spring's @Qualifier

@ Resource: Annotation basierend auf JSR-250. @Resource ist @Autowired und @Inject ziemlich ähnlich, aber der Hauptunterschied besteht in den Ausführungspfaden, die verwendet werden, um die erforderliche Bean zum Injizieren zu ermitteln. @Resource schränkt die Suche zuerst nach Namen, dann nach Typ und schließlich nach Qualifikationsmerkmalen ein (wird ignoriert, wenn die Übereinstimmung nach Namen gefunden wird). Mit @Autowired und @Inject wird die Suche zuerst nach Typ, dann nach Qualifikationsmerkmal und schließlich nach Name eingegrenzt.

115
Haim Raman
|------------|---------------|---------------|---------------|-----------------------|
|            | Setter/Field  | Constructor   | Applicable to | Matching order        |
|            | injection     | injection     | type          |                       |
|------------|---------------|---------------|---------------|-----------------------|
| @Autowired |       X       |       X       |               | Type, Qualifier, Name |
|------------|---------------|---------------|---------------|-----------------------|
| @Inject    |       X       |       X       |               | Type, Qualifier, Name |
|------------|---------------|---------------|---------------|-----------------------|
| @Resource  |       X       |               |       X       | Name, Type, Qualifier |
|------------|---------------|---------------|---------------|-----------------------|

Also im Frühjahr Abhängigkeitsinjektion @Inject und @Autowired haben genau das gleiche Verhalten.

15
eztam

Zusätzlich zu @Haim answer es gibt eine gute Beschreibung des Unterschieds zwischen den Annotationen Spring und JSR-330 (Dependency Injection for Java) und wie die letzte mit Spring verwendet wird.

1
Andriy Kryvtsun