Nei paragrafi precedenti abbiamo visto come configure l'IoC container attraverso i metadati in formato xml. Di default la configurazione attraverso le Java Annotation non è abilitata, per abilitarla è necessario inserire nell'applicationContext.xml il tag <context:annotation-config/>. Vediamo ora come usare l'annotazione @Autowired per configurare le dipendenze.
@Autowired su costruttore
public class AutowiredBean1 {
private ServiceAW1 service1;
private ServiceAW2 service2;
@Autowired
public AutowiredBean1(ServiceAW1 service1, ServiceAW2 service2) {
super();
this.service1 = service1;
this.service2 = service2;
}
/**
* business logic..........
*/
}
e nell'applicationContext.xml
<context:annotation-config/>
<bean id="serviceAW1" class="it.mrwebmaster.di.autowired.ServiceAW1Impl"/>
<bean id="serviceAW2" class="it.mrwebmaster.di.autowired.ServiceAW2Impl"/>
<bean id="autowiredBean1" class="it.mrwebmaster.di.autowired.AutowiredBean1"/>
@Autowired su setter o sui campi
public class AutowiredBean2 {
@Autowired
private ServiceAW1 service1;
private ServiceAW2 service2;
public ServiceAW1 getService1() {
return service1;
}
public ServiceAW2 getService2() {
return service2;
}
public void setService1(ServiceAW1 service1) {
this.service1 = service1;
}
@Autowired
public void setService2(ServiceAW2 service2) {
this.service2 = service2;
}
/**
* business logic..........
*/
}
e nell'applicationContext.xml
<bean id="autowiredBean2" class="it.mrwebmaster.di.autowired.AutowiredBean2"/>
Insieme ad @Autowired si può usare @Qualifier per specficare l'id del bean che si vuole iniettare, ad esempio se ci sono due bean che sono della stessa classe, quindi se ci sono possibili ambiguità.
@Autowired
@Qualifier("serviceAW1")
private ServiceAW1 service1;
oppure
@Autowired
public AutowiredBean4(@Qualifier("serviceAW1") ServiceAW1 service1, ServiceAW2 service2) {
.....
Resources
Un'altra funzionalità molto utile che Spring ci mette a disposizione è l'accesso semplificato alla risorse (che possono essere le più svariate come file oppure delle URL). Questa funzionalità viene implementata attraverso l'uso dell'interfaccia Resource e delle sue implementazioni.
L'interfaccia Resource estende la InputStreamSource aggiungendo altre funzionalità. Le principali implementazioni di questa interfaccia sono:
- UrlResource, permette l'accesso a tutte le risorse che sono accedibili attraverso una URL.
- ClassPathResource, permette l'accesso a tutte le risorse del classpath.
- FileSystemResource, permette l'accesso ai files.
- ServletContextResource, permette l'accesso a tutte le risorse che normalmente sono accedibili attraverso il ServletContext.
- InputStreamResource, permette l'accesso alla risorsa di un dato InputStream.
- ByteArrayResource, permette l'accesso alla risorsa di un dato ByteArray.
Attraverso l'esempio seguente vedremo come instaziare e iniettare le Resources nei nostri beans:
public class ResourceBean {
private Resource resource;
public void setResource(Resource resource) {
this.resource = resource;
}
public Resource getResource() {
return resource;
}
}
nell'applicationContext.xml
<bean id="resourceBean" class="it.mrwebmaster.resources.ResourceBean">
<property name="resource" value="classpath:resource"></property>
</bean>
Nell'esempio non si definisce il tipo di Resource che sarà instanziata, ma è Spring che instanzia quella opportuna. Ci sono tre tipi di Resource string, in base alle queli viene instaziata la Resource:
- classpath: instanzia una ClassPathResource
- file: instanzia una FileSystemResource
- http: instanzia una UrlResource