2013-12-08 17 views
46

Qual è la differenza tra le annotazioni @Inject e @Resource e @Autowired?annotazioni Iniettare e Risorsa e Autowired

Quando dovremmo utilizzare ciascuno di essi?

+2

http://docs.spring.io/spring/docs/3.2.4.RELEASE/spring-framework-reference/htmlsingle/#beans-standard-annotations, http://docs.spring.io /spring/docs/3.2.4.RELEASE/spring-framework-reference/htmlsingle/#beans-resource-annotation –

+1

possibile duplicato di [@Resource vs @Autowired] (http://stackoverflow.com/questions/4093504/resource -vs-autowired) –

+1

Bella spiegazione con esempi che ho trovato è [qui] (http://blogs.sourceallies.com/2011/08/spring-injection-with-resource-and-autowired/) – marioosh

risposta

94

La differenza tra @Inject vs @Autowire vs @Resource?

@Autowired: molla correttezza annotazione (al contrario di @Inject e @Resource) che iniettare una risorsa di tipo, cioè dalla classe di dall'interfaccia del campo o imprenditore annotato. Nel caso in cui abbiamo poche implementazioni di un'interfaccia o di una sottoclasse, possiamo limitare la selezione usando l'annotazione @Qualifier per evitare ambiguità. Per una corrispondenza di fallback, il nome bean è considerato un valore di qualificatore predefinito. Sebbene sia possibile utilizzare questa convenzione per fare riferimento a bean specifici per nome, @Autowired è fondamentalmente un'iniezione basata su tipo con qualificatori semantici facoltativi.

@Inject: L'annotazione basata su JSR-330 (Dependency Injection for Java) identifica costruttori, metodi e campi iniettabili. Questa annotazione è un sostituto completo quasi completo per l'annotazione di Spring's @Autowired. Pertanto, anziché utilizzare l'annotazione @Autowired specifica di Spring, potresti scegliere di utilizzare @Inject. Una delle differenze tra @Autowired e @Inject è che @Inject non ha il campo richiesto, quindi nel caso in cui non riusciamo a trovare un oggetto adatto da iniettare fallirà mentre @Autowired può usare required = false e consentire il campo nullo (solo se necessario!). Il vantaggio dell'annotazione @Inject è che anziché iniettare direttamente un riferimento, è possibile chiedere a @Inject di iniettare un Provider. L'interfaccia Provider consente, tra le altre cose, l'iniezione lazy dei riferimenti bean e l'iniezione di più istanze di un bean. Nel caso in cui abbiamo poche implementazioni di un'interfaccia o di una sottoclasse, possiamo limitare la selezione usando l'annotazione @Named per evitare ambiguità. @Named annotation funziona molto come Spring's @Qualifier

@Resource: annotazione basata su JSR-250. @Resource è abbastanza simile a @Autowired e @Inject, ma la differenza principale è rappresentata dai percorsi di esecuzione eseguiti per trovare il bean richiesto da iniettare. @Resource restringerà la ricerca prima per nome, poi per tipo e infine per qualificatori (ignorati se la corrispondenza viene trovata per nome). @Autowired e @Inject restringeranno la ricerca prima per tipo poi per qualificatore e infine per nome.

+5

Puoi dire qualcosa a proposito cosa è raccomandato? La migliore pratica? –

+1

Sarei felice di rispondere al tuo commento, ma preferisco mantenere questa risposta così com'è. Vuoi pubblicare una nuova domanda. –

+1

Nell'ultima riga, hai menzionato @Autowired anche la ricerca per nome, perché so che non ha l'opzione name, vero? –

1

Oltre alla risposta @Haim there is good description della differenza tra le annotazioni Spring e JSR-330 (Dependency Injection per Java) e come utilizzare l'ultimo con Spring.

2
|------------|---------------|---------------|---------------|-----------------------| 
|   | Setter/Field | Constructor | Applicable to | Matching order  | 
|   | injection  | injection  | type   |      | 
|------------|---------------|---------------|---------------|-----------------------| 
| @Resource |  X  |    |  X  | Name, Type, Qualifier | 
|------------|---------------|---------------|---------------|-----------------------| 
| @Autowired |  X  |  X  |    | Type, Qualifier, Name | 
|------------|---------------|---------------|---------------|-----------------------| 
| @Inject |  X  |  X  |    | Type, Qualifier, Name | 
|------------|---------------|---------------|---------------|-----------------------| 
Problemi correlati