@Autowired e @Resource in Spring

L’annotazione @Autowired è usata per configurare l’iniezione di dipendenza in Spring ed è associata a un metodo setter, o a un campo o a un costruttore di una classe.
Nel caso di un metodo setter o di un campo il bean utilizzato per l’iniezione di dipendenza è scelto sulla base del tipo.
Considera il seguente esempio:

  1. crea un progetto java nel tuo ambiente di sviluppo (eclipse, netbeans, etc.)
  2. configura il progetto con Maven con file pom.xml

    in alternativa puoi uilizzare le seguenti librerie:

    • spring-context-3.1.2.RELEASE.jar
    • spring-aop-3.1.2.RELEASE.jar
    • aopalliance-1.0.jar
    • spring-beans-3.1.2.RELEASE.jar
    • spring-core-3.1.2.RELEASE.jar
    • commons-logging-1.1.1.jar
    • spring-expression-3.1.2.RELEASE.jar
    • spring-asm-3.1.2.RELEASE.jar
    • log4j-1.2.17.jar
  3. crea la cartella “conf” e inseriscila nel classpath
  4. crea il file conf/app-context.xml
  5. crea il file conf/log4j.xml
  6. crea il file eu/lucazanini/autowired/Main.java
  7. crea il file eu/lucazanini/autowired/SimpleBean.java
  8. crea il file eu/lucazanini/autowired/SimpleProperty.java

In questo esempio @Autowired è usato per iniettare in SimpleBean la dipendenza con class=”eu.lucazanini.autowired.SimpleProperty”, cioè con un bean che è istanza della classe PropertyBean che è quella utilizzata dal metodo setter “setProperty” in SimpleBean.
@Autowired può avere l’attributo “required” impostato a false o a true:

Il valore di default per “required” è true.
Quando Spring non è in grado di determinare la dipendenza genera una eccezione tranne il caso in cui “required” è impostato a false.

Considera ora l’esempio precedente dopo aver sostituito il file conf/app-context.xml

in cui è stata aggiunto il bean simplePropertyTwo della stessa classe del bean simplePropertyOne già presente.
Questa applicazione produce l’errore:

E’ evidente che l’errore è dovuto alla ambiguità nel determinare quale istanza della classe SimpleProperty è da iniettare come dipendenza in SimpleBean (simplePropertyOne o simplePropertyTwo).
Per evitare questo errore puoi usare l’annotazione @Qualifier specificando l’id del bean corretto in eu/lucazanini/autowired/SimpleBean.java

E’ possibile sostituire la combinazione @Autowired e @Qualifier con @Resource e l’attributo “name” come nell’esempio seguente:

La tabella seguente rappresenta un riassunto dell’intero articolo:

@Autowired @Resource
annotazione di Spring JSR-250
iniezione per tipo
o iniezione per nome con @Qualifier
iniezione per nome
obbligatorio ma con required = false è facoltativo obbligatorio

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.