Qual è la differenza tra @Inject e @Autowired in Spring Framework? Quale usare a quale condizione?


695

Sto esaminando alcuni blog su SpringSource e in uno dei blog l'autore sta usando @Injecte suppongo che possa anche usare @Autowired.

Ecco il pezzo di codice:

@Inject private CustomerOrderService customerOrderService;

Non sono sicuro della differenza tra @Injecte @Autowiredlo apprezzerei se qualcuno spiegasse la sua differenza e quale utilizzare in quale situazione?


3
Non ho una risposta, dato che sono nuovo anche a questo, ma questo potrebbe aiutare sakaenakajima.wordpress.com/2010/08/10/…
Sagar V


2
La differenza tra '@Inject' e '@Autowired' è spiegata bene in questo articolo alextheedom.wordpress.com/2016/02/13/…
Alex Theedom

Risposte:


719

Supponendo che qui ti riferisci alle javax.inject.Injectannotazioni. @Injectfa parte dello standard Java CDI ( Contexts and Dependency Injection ) introdotto in Java EE 6 (JSR-299), leggi di più . Spring ha scelto di supportare l'utilizzo come @Injectsinonimo di @Autowiredannotazione.

Quindi, per rispondere alla tua domanda, @Autowiredè l'annotazione di Spring. @Injectfa parte di una nuova tecnologia Java chiamata CDI che definisce uno standard per l'iniezione delle dipendenze simile a Spring. In un'applicazione Spring, le due annotazioni funzionano allo stesso modo in cui Spring ha deciso di supportare alcune annotazioni JSR-299 oltre alla propria.


115
Quindi in teoria se hai usato @Inject potresti sostituire la molla con un altro framework DI, ad esempio Guice, e iniettare le tue dipendenze allo stesso modo.
Alex Barnes,

71
A rischio di essere pedanti: @Injectè un JSR separato (JSR-330) dal CDI (JSR-299).
Brad Cupit,

36
Se fai affidamento solo sulle annotazioni JSR- *, certo, puoi sostituire il tuo DI framework. Ma lo farai? Una volta che hai iniziato a usare la primavera, è probabile che tu ne abbia usato molto di più rispetto a DI. Non farai solo un cambiamento; e anche se lo fai, non sono poche le ricerche e le sostituzioni che faranno o interromperanno la mossa. D'altra parte, le annotazioni di Spring ti offrono molte più funzionalità. Padroneggiare un buon framework ti darà più che difficilmente usarne molti.
Agoston Horvath,

18
Sono d'accordo con te sul fatto che non cambiamo spesso i framework DI. Tuttavia, se il nostro codice sorgente ha più pacchetti e se si desidera creare un pacchetto comune che si desidera condividere su più progetti e quindi andare con l' @Injectannotazione JSR è meglio che utilizzare @Autowiredche blocca la base di codici con Spring DI.
Aditya,

3
L'uso da @Injectsolo non garantisce l'indipendenza del framework. Dovresti anche dichiarare i fagioli iniettabili senza meccanismi dipendenti dalla struttura come quelli di Spring @Componento application.xml, ma usare @Namede @Singletona livello di classe. Non ho idea se un progetto di primavera dichiari davvero fagioli del genere oggi - non ho mai nemmeno sentito parlare di alcun progetto che è migrato dalla primavera a JEE ...
Marcus K.

162

Ecco un post sul blog che confronta @Resource, @Injecte @Autowired, e sembra fare un lavoro abbastanza completo.

Dal link:

Ad eccezione dei test 2 e 7, la configurazione e i risultati erano identici. Quando ho guardato sotto il cofano ho stabilito che le annotazioni "@Autowired" e "@Inject" si comportano in modo identico. Entrambe queste annotazioni usano "AutowiredAnnotationBeanPostProcessor" per iniettare dipendenze. '@Autowired' e '@Inject' possono essere usati intercambiabili per iniettare i chicchi di primavera. Tuttavia, l'annotazione "@Resource" utilizza "CommonAnnotationBeanPostProcessor" per iniettare dipendenze. Anche se usano classi di post-processore diverse, si comportano tutte in modo quasi identico. Di seguito è riportato un riepilogo dei loro percorsi di esecuzione.

Test 2 e 7 che i riferimenti dell'autore sono 'iniezione per nome campo' e 'un tentativo di risolvere un bean usando un qualificatore non valido', rispettivamente.

La conclusione dovrebbe darti tutte le informazioni di cui hai bisogno.


4
Quell'articolo è una grande spiegazione delle tre annotazioni. Ho dovuto rileggerlo dopo il primo colpo; ma, un articolo eccellente.
Thomas,

1
Molte grazie! L'articolo ha risposto a molte delle mie risposte nella mia ricerca di trovare le differenze e le somiglianze tra Spring e JavaEE, nonché alcune altre domande che avevo.
Kevin Cruijssen,

36

Per gestire la situazione in cui non è presente alcun cablaggio, i bean sono disponibili con l' @Autowired requiredattributo impostato su false.

Ma quando si utilizza @Inject, l'interfaccia del provider funziona con il bean, il che significa che il bean non viene iniettato direttamente ma con il provider.


8
Questo è così importante ed è stato trascurato nelle risposte più votate.
Igor Donin,

Per impostazione predefinita, il parametro richiesto è impostato su true per Autowired. Rif: docs.spring.io/spring-framework/docs/current/javadoc-api/org/…
tranquillo

25

A partire dalla primavera 3.0, offerte molla di supporto per JSR-330 annotazioni iniezione di dipendenza ( @Inject, @Named, @Singleton).

C'è una sezione separata nella documentazione di Spring su di loro, inclusi i confronti con i loro equivalenti di Spring.


Domanda qui, cosa intendi quando dici che Spring supporta JSR? Il contenitore non supporta JSR indipendentemente da Spring e un requisito per il contenitore deve essere conforme a J2EE? Vuoi dire che avvolge la funzionalità? Se Spring non lo "supportasse", l'annotazione di javax non funzionerebbe comunque per impostazione predefinita?
Dan Chase,

Non è necessario eseguire Spring in un contenitore JEE, puoi anche usarlo in un servlet / contenitore JSP come Tomcat e avere ancora il supporto JSR-330. Spring è un contenitore DI separato, non "scambia" i bean CDI con il server JEE host se è quello che intendi. È possibile utilizzare CDI in un contenitore JEE o Spring bean, ma non è possibile utilizzare entrambi (pronti all'uso).
Andre Steingress,

22

La differenza chiave (notata durante la lettura di Spring Docs ) tra @Autowireded @Injectè quella, @Autowiredha l'attributo 'richiesto' mentre l'attributo @Inject non ha l'attributo 'richiesto'.


cosa intendi per obbligatorio?
Mattyman,

2
@mattymanme From the docs, "Per impostazione predefinita, l'autowiring ha esito negativo ogni volta che sono disponibili zero bean candidati; il comportamento predefinito consiste nel considerare metodi, costruttori e campi annotati come indicanti le dipendenze richieste. Questo comportamento può essere modificato impostando l'attributo richiesto su false ". Ad esempio:. @Autowired(required=false)In parole semplici, "L' requiredattributo indica che la proprietà non è richiesta per scopi di autowiring, la proprietà viene ignorata se non può essere autowired."
Lucky

cerca nell'interfaccia pubblica del codice sorgente Autowired {/ ** * Dichiara se è richiesta la dipendenza annotata. * / booleano richiesto () predefinito vero; } interfaccia pubblica Inject {}
tarn,

15

Meglio usare @Inject tutto il tempo. Perché è l'approccio di configurazione Java (fornito da Sun) che rende la nostra applicazione indipendente dal framework. Quindi, se fai primavera anche le tue lezioni funzioneranno.

Se usi @Autowired funzionerà solo con spring perché @Autowired è un'annotazione fornita da spring.


13
Il sole è morto. Lunga vita al sole.
Amrinder Arora,

6
con che frequenza cambi il framework? solo curioso
Kay,

Sulla maggior parte dei progetti ho visto Autowired anziché Inject. Capisco la logica della risposta, ma non posso votare.
Witold Kaczurba,

13

@Autowired l'annotazione è definita nel framework Spring.

@Injectl'annotazione è un'annotazione standard, definita nella norma "Iniezione delle dipendenze per Java" (JSR-330) . Spring (dalla versione 3.0) supporta il modello generalizzato di iniezione di dipendenza che è definito nello standard JSR-330. (Anche i framework Google Guice e Picocontainer supportano questo modello).

Con @Injectpuò essere iniettato il riferimento all'implementazione Providerdell'interfaccia, che consente di iniettare i riferimenti differiti.

Annotazioni @Injecte @Autowired- analogie quasi complete. Oltre @Autowiredall'annotazione, l' @Injectannotazione può essere utilizzata per proprietà, metodi e costruttori di rilegatura automatici.

Contrariamente @Autowiredall'annotazione, l' @Injectannotazione non ha alcun requiredattributo. Pertanto, se le dipendenze non verranno trovate, verrà generata un'eccezione.

Ci sono anche differenze nei chiarimenti delle proprietà di associazione. In caso di ambiguità nella scelta dei componenti per l'iniezione, è @Namednecessario aggiungere il qualificatore. In una situazione simile per l' @Autowiredannotazione verrà aggiunto il @Qualifierqualificatore (JSR-330 definisce la propria @Qualifierannotazione e tramite questa qualifica @Namedviene definita l' annotazione ).


Anche se '@Inject' non ha un attributo richiesto lo stato di Java Docs: è richiesta l'iniezione di membri annotati con '@Inject'. Il che sembra implicare che se un membro non viene trovato, l'iniezione fallirà. Vedi Java Docs: docs.oracle.com/javaee/7/api/javax/inject/Inject.html
Alex Theedom,


12

Oltre a quanto sopra:

  1. L'ambito predefinito per i @Autowiredbean è Singleton mentre usando l' @Injectannotazione JSR 330 è come il prototipo di Spring .
  2. Non esiste un equivalente di @Lazy in JSR 330 utilizzando @Inject.
  3. Non esiste un equivalente di @Value in JSR 330 utilizzando @Inject.

0

L' @Injectannotazione fa parte della raccolta di annotazioni JSR-330. Questo ha i percorsi di esecuzione Abbina per tipo, Abbina per qualificatore, Abbina per nome. Questi percorsi di esecuzione sono validi sia per l'inseritore che per l'iniezione di campo. Il comportamento @Autowireddell'annotazione è uguale @Injectall'annotazione. L'unica differenza è che l' @Autowiredannotazione fa parte del framework Spring. @Autowiredl'annotazione ha anche i percorsi di esecuzione sopra indicati. Quindi raccomando il @Autowiredper la tua risposta.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.