back to top

Core container – @Autowired e Resources – Guida Java Spring

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
PubblicitÃ