JUG Sardegna supports Devoxx 2012
Vuoi ricevere uno zainetto? Clicca qui

Java User Groups
Java.net Partner
Get Firefox!

Spring2 Core I I

Articolo di MassimilianoDessi
Spring 2.0 Core II parte
vers 0.1




File di configurazione e recupero dei bean:

Una volta che la BeanFactory (nota: anche lÂ’ApplicationContext è una BeanFactory) ha caricato i file di configurazione, la nostra applicazione è pronta per richiamare i bean che le necessitano.

Se volessimo recuperare il bean in maniera esplicita in base allÂ’ id definito nel file di configurazione scriveremmo:


MioOggetto obj = (MioOggetto)appContext.getBean(“miobeanUno”);


oppure per tipo


Map oggettiDiTipoMioOggetto = ctx.getBeansOfType(MioOggetto.class);


Per molti casi dÂ’uso, Spring fornisce dei bean che dietro le quinte forniscono il supporto per quasi tutte le operazioni, e non sarà quasi mai necessario richiamare esplicitamente i bean, ma sarà necessario solo scrivere i set degli oggetti di cui i nostri oggetti hanno bisogno.


Configurazioni tramite metodi Set

Vediamo come configurare i bean per iniettare le dipendenze tramite metodi set


-Bean senza dipendenze


  <bean name="jugavis.interceptorUser" class="org.jugsardegna.avis.web.interceptor.ReferenteHandlerInterceptor"/>


Id rappresenta lÂ’ id univoco con il quale identificare il bean e per riferirlo nellÂ’ iniettarlo in un altro bean
Class identifica il nome completo della classe.


-Bean con iniezione di un altro bean

Supponiamo che il servizio di gestione degli utenti abbia bisogno di un iBATIS dao (che implementa UtentiDao) che è definito da qualche altra parte come bean ( che a sua volta necessita di un sqlMapClient e di un datasource).


<bean name="jugavis.utentiDao" class="org.jugsardegna.avis.web.dao.UtentiDaoImpl"
    p:sqlMapClient-ref="jugavis.sqlMapClient" p:dataSource-ref="jugavis.dataSource"
      p:numeroUtentiPerPagina="15"/>



La classe UtentiServiceImpl avrà quindi un metodo setUtentiDao.



  public void setUtentiDao(UtentiDao utentiDao) {
    this.utentiDao = utentiDao;
  }

  private UtentiDao utentiDao;



Il property name corrisponde a setUtentiDao, mentre ref bean indica invece lÂ’id del bean che viene passato al metodo setUtentiDao



<bean name="jugavis.utentiService" class="org.jugsardegna.avis.web.service.UtentiServiceImpl"
    p:utentiDao-ref="jugavis.utentiDao"/>



In questo modo iniettiamo altri bean, naturalmente non ha importanza lÂ’ordine in cui vengono definiti i bean nei file di configurazione Spring risolve comunque le dipendenze.
Prima di istanziare gli oggetti, viene verificato che tutte le dipendenze siano soddisfatte.


-Bean con iniezione di String o di int

In una ipotetica classe ManagerAccessi che avesse bisogno di una campo saluto di tipo String


public void setSaluto(String saluto) {
  this.saluto = saluto;
}



<bean id="managerAccessi" class="org.casamia.service.ManagerAccessi"
p:saluto="Ciao ciao !"/>


se invece avesse solo un campo che indica numero tentativi di tipo int


public void setNumeroTentativiAccesso(int tentativi) {
  this. tentativi = tentativi;
}



<bean id="managerAccessi" class="org.casamia.service.ManagerAccessi"
p:numeroTentativiAccesso="3"/>


Se capitasse di dover mettere una stringa che rappresenta un numero, Spring distingue in base al tipo di parametri in ingresso, e inietta la dipendenza facendo la conversione appropriata al tipo corretto.


-Bean con iniezione di Collections

Una List può contenere qualsiasi oggetto, perciò nella dichiarazione possiamo mettere quello che vogliamo, un altro bean, una stringa, o anche una altra list


<property name="lista">
<list>
  <value>bye</value>
  <ref bean="managerDirectory"/>
</list>
</property>



public void setLista(List lista) {
  this.lista= lista;
}



Con un Set la configurazione è la stessa


<property name="hashSet">
<set>
  <value>bye</value>
  <ref bean="managerDirectory"/>
</set>
</property>



public void setHashSet(Set hashSet) {
  this. hashSet = hashSet;
}



Con un Map mettiamo coppie chiavi valore, il valore può essere una stringa ma anche un altro bean


<property name="hashMap">
<map>
  <entry key="chiave1">
    <value>bye</value>
    </entry>
<entry key="chiave2">
    <ref bean="managerDirectory"/>
    </entry>
</map>
</property>



public void setHashMap(Map hashMap) {
  this.hashMap = hashMap;
}



Con le Properties la configurazione è simile a Map, ma i valori possono essere solo Stringhe


<property name="props">
<props>
  <entry key="chiave_1">prima posizione</entry>
<entry key="chiave_2">seconda posizione</entry>
</props>
</property>



public void setProps(Properties props) {
  this.props = props;
}



-Inner bean

Nel caso avessimo un bean che viene usato solo in un punto potremmo anche dichiararlo internamente al bean che lo usa.
(per chiarezza di comprensione omettiamo la notazione breve p:)


<bean id="managerAccessi" class="org.casamia.service.ManagerAccessi">
    <property name="utentiDao">
<bean class="org.casamia.dao.UtentiDaoImpl">
        <property name="dataSource">
<ref bean="postgresDataSource"/></property>
</bean>
</property>
</bean>


Però in questo caso perdiamo la possibilità di riutilizzare lÂ’inner bean che infatti non ha neppure lÂ’id.


-Numero di istanze del bean

Il comportamento di default di Spring, è di considerare i bean come Singleton, cioè creare una sola istanza e condividerla tra gli oggetti che ne hanno bisogno.
Nel caso si volesse invece che venga creata una nuova istanza ogni volta che viene richiamato il bean, bisogna dichiarare questo comportamento nella dichiarazione con singleton= false


<bean id="managerAccessi" class="org.casamia.service.ManagerAccessi" singleton="false Â… />


-Metodi di inizializzazione e distruzione

Vediamo come dichiarare che la nostra classe ha un metodo da richiamare per lÂ’inizializzazione e uno quando viene distrutto .


public void setUp() {
  //inizializzazioni varie
  Â…
}

public void tearDown() {
  //pulizie varie
  Â…
}



<bean id="managerAccessi" class="org.casamia.service.ManagerAccessi" 
init-method="setUp" destroy-method="tearDown">Â…



Configurazioni tramite costruttori

Vediamo come configurare i bean per iniettare le dipendenze mediante i costruttori.
LÂ’iniezione tramite i costruttori sovente avviene con classi di applicazioni preesistenti che vengono convertite allÂ’uso di Spring.



<bean id="managerAccessi" class="org.casamia.service.ManagerAccessi">
        <constructor-arg><ref bean="utentiDao"/></constructor-arg>
</bean>


Questa configurazione specifica che al costruttore verrà passato un oggetto UtentiDao (interface)



<bean id="managerAccessi" class="org.casamia.service.ManagerAccessi">
      <constructor-arg><value>3</value></constructor-arg>
</bean>


Questa configurazione specifica che al costruttore verrà passata una Stringa o un int a seconda di quello
che Spring attraverso lÂ’introspezione troverà come argomento al costruttore (come per i set)


Nel caso ci possano essere delle ambiguità nei parametri da passare al costruttore, si può configurare anche la posizione dei parametri da passare, ad esempio String e URL.


<bean id="managerBookmarks" class="org.casamia.service.ManagerBookMarks">
        <constructor-arg index="1"><value>http://www.jugsardegna.org/vqwiki/jsp/Wiki?MassimilianoDessi</value></constructor-arg>
<constructor-arg index="0"><value>http://jroller.com/page/desmax</value></constructor-arg>
</bean>



Oppure più semplicemente con il tipo.


<bean id="managerLinks" class="org.casamia.service.ManagerLinks">
        <constructor-arg type="java.net.Url">
<value>http://wiki.java.net/bin/view/People/MassimilianoDessi</value>
</constructor-arg>
<constructor-arg type="java.lang.String">
<value>http://jroller.com/page/desmax</value>
</constructor-arg>
</bean>




Autowiring

Spring volendo, consente la possibilità di non dichiarare esplicitamente le dipendenze fra i bean,
risolvendo le dipendenze automaticamente in base al tipo o al nome, ma i file di configurazione perdono così il minimo di autodocumentazione che hanno normalmente e rendono difficoltosa la manutenzione e le modifiche.



PropertyPlaceHolderConfigurer

In alcuni casi potrebbe essere agevole spostare alcune parti della configurazione dei bean su un file di properties.
Definiamo quindi un bean con la lista degli eventuali file di properties in cui Spring deve cercare i valori dei segnaposto presenti nella configurazione.


<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="locations">
      <list>
        <value>WEB-INF/mail.properties</value>
        <value>WEB-INF/jdbc.properties</value>
      </list>
    </property>
</bean>


<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" 
destroy-method="close">
    <property name="driverClassName"><value>${jdbc.driverClassName}</value>
</property>
    <property name="url"><value>${jdbc.url}</value></property>
    <property name="username"><value>${jdbc.username}</value></property>
    <property name="password"><value>${jdbc.password}</value></property>
</bean>


e il file jdbc.properties conterrà:

jdbc.driverClassName=org.postgresql.Driver
jdbc.url=jdbc:postgresql://localhost:5432/jugavis
jdbc.username=postgres
jdbc.password=postgres


Spring Core parte I

Spring Core parte III

Autore
Massimiliano Dessì (http://www.jugsardegna.org/vqwiki/jsp/Wiki?MassimilianoDessi) ha iniziato a lavorare alla Sistemi Informativi (società IBM) , attualmente e' consulente per il Centro Servizi della regione Sardegna , dove sviluppa applicazioni J2EE basate su Spring, utilizzando metodologie agili.
Cura la versione italiana di Jetspeed e di Spring BeanDoc, sviluppa la versione Web del progetto Jug Avis utilizzando Spring, tiene seminari e corsi su tecnologie J2EE e collabora con società ed enti italiani ed esteri per la realizzazione di portali J2EE.
EÂ’ co-fondatore e consigliere del Jug Sardegna (http://www.jugsardegna.org).
EÂ’ coordinatore dello Spring Framework Italian User Group (http://it.groups.yahoo.com/group/SpringFramework-it )
e del Jetspeed Italian Group http://it.groups.yahoo.com/group/jetspeed-it e del Groovy Italian User Group http://it.groups.yahoo.com/group/GroovyItalianUserGroup

Bibliografia
[1] Rod Johnson, Juergen Hoeller, Alef Arendsen, Thomas Risberg, Colin Sampaleanu, " Java Development with the Spring Framework", Wrox, 2005, ISBN: 0-7645-7483-3, http://www.wrox.com/WileyCDA/WroxTitle/productCd-0764574833.html
[2] Craig Walls and Ryan Breidenbach, " Spring in Action", Manning, 2005, ISBN 1932394354, http://www.manning.com/books/walls2
[3] Rob Harrop, Jan Machacek, "Pro Spring", Apress, 2005, ISBN 1-59059-461-4, http://www.apress.com/book/bookDisplay.html?bID=405
[4] Rod Johnson, Juergen Hoeller, " J2EE Development without EJB", Wrox, 2004, ISBN 0-7645-5831-5, http://www.wrox.com/WileyCDA/WroxTitle/productCd-0764558315.html
[5] Rod Johnson, " J2EEDesign and Development ", Wrox, 2002, ISBN 0-7645-4385-7, http://www.wrox.com/WileyCDA/WroxTitle/productCd-0764543857.html
[6] Seth Ladd, Darren Davison, Steven Devijver, Colin Yates " Expert Spring MVC and Web Flow", Apress, 2006, ISBN 159059584X, http://apress.com/book/bookDisplay.html?bID=10048


Riferimenti
[7]”Inversion of Control Containers and the Dependency Injection pattern”: http://www.martinfowler.com/articles/injection.html
[8]”Sito Spring”: http://www.springframework.org/
[9] ”Forum Spring”: http://forum.springframework.org/
[10]”Raccolta articoli e recensioni in italiano su Spring”: http://www.jugsardegna.org/vqwiki/jsp/Wiki?SpringFramework
[11]” Spring Framework Italian User Group”: http://it.groups.yahoo.com/group/SpringFramework-it


VeryQuickWiki Version 2.7.8 | Admin
Copyright © 2003-20011 Java User Group Sardegna Onlus. - Java, the Java Coffee Cup Logo and the Duke Logo are trademarks or registered trademarks of Oracle corporation in the U.S. and other countries.