SlideShare ist ein Scribd-Unternehmen logo
1 von 25
Downloaden Sie, um offline zu lesen
Spring, iBATIS e Transazioni AOP
                     nel Jug Avis Web




                                             Massimiliano Dessì Frame S.r.l
               http://www.jugsardegna.org/vqwiki/jsp/Wiki?MassimilianoDessi
Massimiliano Dessì, Spring, iBatis e Transazioni AOP nel Jug Avis Web.   1
Macomer, 28 Gennaio 2006
Architettura Generale Jug Avis Web:




Interamente Interface Driven Design sviluppato usando TDD
(Test Driven Development)


Massimiliano Dessì, Spring, iBatis e Transazioni AOP nel Jug Avis Web.   2
Macomer, 28 Gennaio 2006
Data Access Tier:

Soluzioni prese in considerazione per l'accesso a DB

                                             JDBC
                                          Hibernate
                                            iBatis




Massimiliano Dessì, Spring, iBatis e Transazioni AOP nel Jug Avis Web.   3
Macomer, 28 Gennaio 2006
JDBC:
Pro

- Ben Conosciuta, possibilità controllo fine sul Codice e su SQL

Contro

-Eccessiva Verbosità

-Manutenzione con query complesse composte dinamicamente

-Codice “boilerplate” con try-catch obbligatori

-La classe DAO “deve” sapere di essere eseguita dentro una
 transazione e deve essere scritto di conseguenza

Massimiliano Dessì, Spring, iBatis e Transazioni AOP nel Jug Avis Web.   4
Macomer, 28 Gennaio 2006
Hibernate:
Pro
-ORM, ragionamento OO-LIKE , non SQL-LIKE
-Tools per velocizzare generazione codice e files
-Adatto con DB modificati spesso
-Caching

Contro

-Non SQL-LIKE, no DBA Tuning
-Necessario per il web l' uso del pattern Open Session in View
-N+1 Select
-Esperienza per controllo fine settaggi configurazione

Licenza: GPL
Massimiliano Dessì, Spring, iBatis e Transazioni AOP nel Jug Avis Web.   5
Macomer, 28 Gennaio 2006
iBatis:
Pro
-Data Mapper, SQL separato dal codice, DBA Tuning
-Semplicissimo da usare
-Caching
-Velocità rispetto ad ORM
-Ora disponibile tool per generazione codice (Abator)
-N+1 select evitabile scrivendo opportunamente le query


Contro
Non è ancora “famoso” e conosciuto

Licenza: Apache

Massimiliano Dessì, Spring, iBatis e Transazioni AOP nel Jug Avis Web.   6
Macomer, 28 Gennaio 2006
iBatis configurazione con Spring
<bean id=quot;jug4avisweb.sqlMapClientquot;
         class=quot;org.springframework.orm.ibatis.SqlMapClientFactoryBeanquot;>
         <property name=quot;configLocationquot;>
             <value>WEB-INF/jug-sqlMapConfig.xml</value>
         </property>
 </bean>


<bean id=quot;jug4avisweb.dataSourcequot;
        class=quot;org.springframework.jndi.JndiObjectFactoryBeanquot;>
        <property name=quot;jndiNamequot;>
            <value>java:comp/env/jdbc/jug4avis</value>
        </property>
</bean>


<bean id=quot;transactionManagerquot;
        class=quot;org.springframework.jdbc.datasource.DataSourceTransactionManagerquot;>
        <property name=quot;dataSourcequot;><ref bean=quot;jug4avisweb.dataSourcequot;/></property>
</bean>



Massimiliano Dessì, Spring, iBatis e Transazioni AOP nel Jug Avis Web.         7
Macomer, 28 Gennaio 2006
<?xml version=quot;1.0quot; encoding=quot;UTF-8quot; ?>
  <!DOCTYPE sqlMapConfig
      PUBLIC quot;-//iBATIS.com//DTD SQL Map Config 2.0//ENquot;
      quot;http://www.ibatis.com/dtd/sql-map-config-2.dtdquot;>

  <sqlMapConfig>
  <settings
  cacheModelsEnabled=quot;truequot;
  enhancementEnabled=quot;truequot;
  lazyLoadingEnabled=quot;falsequot;
  maxRequests=quot;64quot;
  maxSessions=quot;20quot;
  maxTransactions=quot;8quot;
  useStatementNamespaces=quot;falsequot;
  />
      <sqlMap
  resource=quot;org/jugsardegna/avis/web/db/ibatis/CentroAvisDaoPostgres.xmlquot;/>
      <sqlMap
  resource=quot;org/jugsardegna/avis/web/db/ibatis/DonorDaoPostgres.xmlquot;/>
  </sqlMapConfig>


  File di configurazione jug4avisweb-sqlMapConfig.xml



Massimiliano Dessì, Spring, iBatis e Transazioni AOP nel Jug Avis Web.
                                                                              8
Macomer, 28 Gennaio 2006
<?xml version=quot;1.0quot; encoding=quot;UTF-8quot; standalone=quot;noquot;?>
<!DOCTYPE sqlMap PUBLIC quot;-//iBATIS.com//DTD SQL Map 2.0//ENquot;
quot;http://www.ibatis.com/dtd/sql-map-2.dtdquot;>

<sqlMap>

    <cacheModel id=quot;file-cachequot; type =quot;LRUquot; >
        <flushInterval hours=quot;24quot;/>
        <flushOnExecute statement=quot;insertCentroquot;/>
        <flushOnExecute statement=quot;deleteCentroquot;/>
        <flushOnExecute statement=quot;aggiornaCentroquot;/>
        <property name=quot;cache-sizequot; value=quot;1000quot; />
    </cacheModel>

  <typeAlias type=quot;org.jugsardegna.avis.web.domain.CentroAvisquot; alias=quot;centroAvisquot;/>

     <resultMap class=quot;centroAvisquot; id=quot;resultCentroAvisquot;>
        <result property=quot;idquot; column=quot;idquot;/>
        <result property=quot;nomequot; column=quot;nomequot;/>
         <result property=quot;faxquot; column=quot;faxquot;/>
         <result property=quot;telefonoquot; column=quot;telefonoquot;/>
         <result property=quot;emailquot; column=quot;emailquot;/>
         <result property=quot;sitoWebquot; column=quot;sito_webquot;/>
         <result property=quot;localitaquot; column=quot;localitaquot;/>
         <result property=quot;creditoResiduoSmsquot; column=quot;credito_residuo_smsquot;/>
         <result property=quot;numeroDonatoriquot; column=quot;numero_donatoriquot;/>
     </resultMap>
Massimiliano Dessì, Spring, iBatis e Transazioni AOP nel Jug Avis Web.         9
Macomer, 28 Gennaio 2006
<select id=quot;getCentroAvisquot; resultMap=quot;resultCentroAvisquot;>
    SELECT * FROM centri_avis WHERE id= #value# ;
  </select>

  <delete id=quot;deleteCentroquot; parameterClass=quot;longquot;>
          DELETE FROM centri_avis WHERE id=#value# ;
  </delete>

     <insert id=quot;insertCentroquot; parameterClass=quot;centroAvisquot;>
          <selectKey keyProperty=quot;idquot; resultClass=quot;longquot;>
                select nextval('id_univoco')
          </selectKey>
          INSERT INTO centri_avis (id, nome, localita, telefono, email, fax, sito_web,
          credito_residuo_sms, numero_donatori)
          VALUES ( #id#, #nome#, #localita#, #telefono#, #email#, #fax#, #sitoWeb#, #creditoResiduoSms#,
          #numeroDonatori#);
     </insert>

     <update id=quot;aggiornaCentroquot; parameterClass=quot;centroAvisquot;>
         UPDATE centri_avis SET nome = #nome# , telefono = #telefono#, email = #email#,
         fax =#fax#, sito_web = #sitoWeb#, localita = #localita#, credito_residuo_sms = #creditoResiduoSms#,
         numero_donatori = #numeroDonatori#
         WHERE Id = #id# ;
     </update>
</sqlMap>
File di configurazione CentroAvisDaoPostgres.xml

Massimiliano Dessì, Spring, iBatis e Transazioni AOP nel Jug Avis Web.                                     10
Macomer, 28 Gennaio 2006
iBatis DAO (1)
SqlMapCentroAvisDao




public class SqlMapCentroAvisDao extends SqlMapClientDaoSupport
                                     implements ICentroAvisDao{


    public List getCentriAvis(){
        return getSqlMapClientTemplate().queryForList(quot;getCentriAvisquot;, null);
    }


    public CentroAvis getCentro(long idCentroAvis){
        return (CentroAvis)getSqlMapClientTemplate().
               queryForObject(quot;getCentroAvisquot;, new Long(idCentroAvis));
    }




Massimiliano Dessì, Spring, iBatis e Transazioni AOP nel Jug Avis Web.          11
Macomer, 28 Gennaio 2006
iBatis DAO (2)
public long insertCentroAvis(CentroAvis centro){
       return ((Long)getSqlMapClientTemplate().
                      insert(quot;insertCentroquot;, centro)).longValue();
    }

     public int updateCentroAvis(CentroAvis centro){
         return ((Integer)getSqlMapClientTemplate().
                           update(quot;aggiornaCentroquot;, centro)).intValue();
     }

     public int deleteCentroAvis(long idCentroAvis){
         return ((Integer)getSqlMapClientTemplate().
                delete(quot;deleteCentroquot;, idCentroAvis)).intValue();
     }
}




Massimiliano Dessì, Spring, iBatis e Transazioni AOP nel Jug Avis Web.     12
Macomer, 28 Gennaio 2006
- I dao non sanno minimamente di essere dentro
  una transazione o meno

- non siamo obbligati a gestire try-catch
  (naturalmente in una altra parte della applicazione,
  verranno tracciate e gestite convenientemente in caso
  vengano lanciate eccezioni)

- Le query sono separate e facili da modificare




Massimiliano Dessì, Spring, iBatis e Transazioni AOP nel Jug Avis Web.   13
Macomer, 28 Gennaio 2006
Transazioni (obiettivo)
Vogliamo fare in modo che alcuni metodi vengano
eseguiti come unità atomiche di lavoro:

- Senza modiche nel codice in maniera
  che siano metodi riutilizzabili

- Senza scrivere codice,
  ma dichiarando (Declarative Transaction Demarcation)
  semplicemente quali metodi e
  con quali livelli di scope

Nota: Le transazioni di cui necessitiamo sono
      su un datasource locale, non distribuito.


Massimiliano Dessì, Spring, iBatis e Transazioni AOP nel Jug Avis Web.   14
Macomer, 28 Gennaio 2006
Per realizzare i nostri obiettivi usiamo il supporto
per utilizzare l'AOP (Aspect Oriented Programming)
per mezzo di Spring.

Con AspectJ
 o
con classi Java che fungano da Proxy

In questa brevissima presentazione vedremo il
secondo caso, di più facile comprensione.

Nota:
AspectJ verrà usato nel Jug Avis Web con l'uscita
della versione 2.0 di Spring nella primavera 2006



Massimiliano Dessì, Spring, iBatis e Transazioni AOP nel Jug Avis Web.   15
Macomer, 28 Gennaio 2006
Brevissima spiegazione sull' AOP:

-Separazione delle competenze trasversali
-Complementare all' OO

es.
Nelle classi, dove è necessario il logging, ad esempio il
tracciamento delle eccezioni, viene richiamato un Logger
 (staticamente o con l' IOC ), e viene eseguito il tracciamento

Con la programmazione ad Aspetti scriviamo solo una volta il modulo (Aspect) e
nella sua dichiarazione diciamo quando deve essere eseguito.
Se usiamo AspectJ, durante la “compilazione” (weaving), l' aspect weaver (compilatore
compone il sistema finale legando i nostri moduli trasversali (aspects) .
Naturalmente questo processo produce bytecode standard per la virtual machine.

Il logger sparisce dalle classi dove lo avremmo dovuto mettere per poterlo usare con
il solo uso dell' OO.
Possiamo anzi, creare anche un aspect che gestisca il lancio delle eccezioni !




Massimiliano Dessì, Spring, iBatis e Transazioni AOP nel Jug Avis Web.           16
Macomer, 28 Gennaio 2006
Grazie all' AOP possiamo modularizzare le competenze trasversali
  che altrimenti con la programmazione ad Oggetti “tradizionale” sarebbero
  presenti in tutte le classi in cui sono necessarie.


  Vediamo invece ora come è possibile “emulare” il funzionamento di AspectJ,
  con delle classi proxy usando il pattern Proxy e Decorator.
  Naturalmente il funzionamento con le classi proxy, è conforme alle
  interfacce
  della AOP Alliance, per poter essere interoperabile tra le varie
  implementazioni AOP.


  Il funzionamento con i Proxy di SpringAOP, ruota attorno all' uso di una
  catena di intercettori tra l'oggetto chiamante e quello invocato.
  Ogni elemento della catena ha la possibilità di interporre logica prima della
  invocazione, dopo l'invocazione, o circuitare anche l' invocazione.



Massimiliano Dessì, Spring, iBatis e Transazioni AOP nel Jug Avis Web.       17
Macomer, 28 Gennaio 2006
Massimiliano Dessì, Spring, iBatis e Transazioni AOP nel Jug Avis Web.   18
Macomer, 28 Gennaio 2006
Ora che abbiamo spiegato in maniera molto veloce lo scopo dell' AOP,
  vediamo come possiamo usarlo nel JUG Avis per le Transazioni.

  Prendiamo come esempio la classe ManagerCentriAvis, dove, quando un centro
  deve essere eliminato, deve eliminare nella stessa transazione anche i
  donatori di quel centro.
  Perciò questa classe sarà la classe target.
  Come Proxy usiamo un classe predefinita fornita da Spring:

  TransactionProxyFactoryBean (AOP Proxy di pag. 18)
   che per fare il suo lavoro ha bisogno dell' iniezione di
  -TransactionManager
  -Target (ManagerCentriAvis)
  -TransactionAttributes (nomi o pattern ai quali applicare la
  transazionalità)

  Nella parte dei TransactionAttributes possiamo definire la propagazione della
  transazione, il livello di isolamento, il timeout e il flag readOnly.
  Nota:
  Se avessimo bisogno di dichiarare più manager useremmo una altra tecnica.
Massimiliano Dessì, Spring, iBatis e Transazioni AOP nel Jug Avis Web.            19
Macomer, 28 Gennaio 2006
<bean id=quot;jug4avisweb.managerCentriAvisTargetquot;
class=quot;org.jugsardegna.avis.web.service.impl.ManagerCentriAvisquot;>
<property name=quot;centroAvisDaoquot;><ref bean=quot;jug4avisweb.centroAvisDaoquot;/></property>
<property name=quot;managerDonorsquot;><ref bean=quot;jug4avisweb.managerDonorquot;/></property>
</bean>



<bean id=quot;jug4avisweb.managerCentriAvisquot;
class=quot;org.springframework.transaction.interceptor.TransactionProxyFactoryBeanquot;>
           <property name=quot;transactionManagerquot;>
                <ref bean=quot;transactionManagerquot;/>
           </property>
           <property name=quot;targetquot;>
                <ref bean=quot;jug4avisweb.managerCentriAvisTargetquot;/>
           </property>
           <property name=quot;transactionAttributesquot;>
                <props>
                      <prop key=quot;insert*quot;>PROPAGATION_REQUIRED</prop>
                      <prop key=quot;update*quot;>PROPAGATION_REQUIRED</prop>
                      <prop key=quot;delete*quot;>PROPAGATION_REQUIRED</prop>
                </props>
           </property>
</bean>



Massimiliano Dessì, Spring, iBatis e Transazioni AOP nel Jug Avis Web.              20
Macomer, 28 Gennaio 2006
Transaction Attributes:
PROPAGATION_REQUIRED : Supporta la transazione esistente, Se non
esiste ne crea una nuova
PROPAGATION_SUPPORTS: Supporta la transazione esistente, Se non
esiste esegue non transazionalmente
PROPAGATION_MANDATORY:Supporta la transazione esistente, Se non
esiste lancia una eccezione
PROPAGATION_REQUIRES_NEW:Fa partire sempre una nuova
transazione, se ne esiste già una la sospende.
PROPAGATION_NOT_SUPPORTED:Non viene eseguito se esiste una
transazione attiva. Eseguito sempre non transaz.e sospende quelle attive.
PROPAGATION_NEVER: Eseguito non transazionalmente, viene lanciata na
eccezione se esiste una transazione attiva.
PROPAGATION_NESTED:Eseguito in una transazione annidata se ne esiste
una, altrimenti, viene eseguita come propagation_required.


Massimiliano Dessì, Spring, iBatis e Transazioni AOP nel Jug Avis Web.   21
Macomer, 28 Gennaio 2006
Riferimenti 1

                                                Spring :
                                http://www.springframework.org

                                     Nel Jug Sardegna
                                (Articoli, Recensioni Libri):
           http://www.jugsardegna.org/vqwiki/jsp/Wiki?SpringFramework

                                                Jug Avis:
                  http://www.jugsardegna.org/vqwiki/jsp/Wiki?JugAvis

                               Jug Avis Web (prima parte):
http://www.jugsardegna.org/vqwiki/jsp/Wiki?action=action_view_attachment
            &attachment=Spring_webflowJug16Luglio2005.pdf




Massimiliano Dessì, Spring, iBatis e Transazioni AOP nel Jug Avis Web.   22
Macomer, 28 Gennaio 2006
Riferimenti 2

                                                 IBatis :
                                      http://ibatis.apache.org/

                                        Nel Jug Sardegna:
            http://www.jugsardegna.org/vqwiki/jsp/Wiki?IBatisCaseStudy

                                         Abator for iBatis:
                              http://ibatis.apache.org/abator.html




Massimiliano Dessì, Spring, iBatis e Transazioni AOP nel Jug Avis Web.   23
Macomer, 28 Gennaio 2006
Riferimenti 3

                                                 AspectJ:
                                 http://www.eclipse.org/aspectj/

                       Aspect-Oriented Software Development AOSD
                                   http://www.aosd.net/

                                     AspectJ in Action
                           http://www.manning.com/books/laddad




Massimiliano Dessì, Spring, iBatis e Transazioni AOP nel Jug Avis Web.   24
Macomer, 28 Gennaio 2006
Grazie per l'attenzione.




Massimiliano Dessì, Spring, iBatis e Transazioni AOP nel Jug Avis Web.   25
Macomer, 28 Gennaio 2006

Weitere ähnliche Inhalte

Andere mochten auch

MongoDB SpringFramework Meeting september 2009
MongoDB SpringFramework Meeting september 2009MongoDB SpringFramework Meeting september 2009
MongoDB SpringFramework Meeting september 2009Massimiliano Dessì
 
Jaxitalia09 Spring Best Practices
Jaxitalia09 Spring Best PracticesJaxitalia09 Spring Best Practices
Jaxitalia09 Spring Best PracticesMassimiliano Dessì
 
MongoDB Scala Roma SpringFramework Meeting2009
MongoDB Scala Roma SpringFramework Meeting2009MongoDB Scala Roma SpringFramework Meeting2009
MongoDB Scala Roma SpringFramework Meeting2009Massimiliano Dessì
 

Andere mochten auch (6)

Jug 30 10 04 Jdo
Jug 30 10 04 JdoJug 30 10 04 Jdo
Jug 30 10 04 Jdo
 
MongoDB SpringFramework Meeting september 2009
MongoDB SpringFramework Meeting september 2009MongoDB SpringFramework Meeting september 2009
MongoDB SpringFramework Meeting september 2009
 
Dessi Tech Day2008 Cagliari
Dessi Tech Day2008 CagliariDessi Tech Day2008 Cagliari
Dessi Tech Day2008 Cagliari
 
Jaxitalia09 Spring Best Practices
Jaxitalia09 Spring Best PracticesJaxitalia09 Spring Best Practices
Jaxitalia09 Spring Best Practices
 
Isefac sqli e-merchandising_2013
Isefac sqli e-merchandising_2013Isefac sqli e-merchandising_2013
Isefac sqli e-merchandising_2013
 
MongoDB Scala Roma SpringFramework Meeting2009
MongoDB Scala Roma SpringFramework Meeting2009MongoDB Scala Roma SpringFramework Meeting2009
MongoDB Scala Roma SpringFramework Meeting2009
 

Ähnlich wie Spring, IBatis e Transazioni Aop Nel Jug Avis Web

Sviluppo web con Ruby on Rails
Sviluppo web con Ruby on RailsSviluppo web con Ruby on Rails
Sviluppo web con Ruby on Railsjekil
 
Seam unifies Java EE by Massimiliano Ciccazzo
Seam unifies Java EE by Massimiliano CiccazzoSeam unifies Java EE by Massimiliano Ciccazzo
Seam unifies Java EE by Massimiliano CiccazzoJava User Group Roma
 
April 2010 - Seam unifies JEE5
April 2010 - Seam unifies JEE5April 2010 - Seam unifies JEE5
April 2010 - Seam unifies JEE5JBug Italy
 
How create a single page apps using html5 and javascript
How create a single page apps using html5 and javascript How create a single page apps using html5 and javascript
How create a single page apps using html5 and javascript Stefano Marchisio
 
Apache Hadoop: Introduzione all’architettura ed approcci applicativi
Apache Hadoop: Introduzione all’architettura ed approcci applicativiApache Hadoop: Introduzione all’architettura ed approcci applicativi
Apache Hadoop: Introduzione all’architettura ed approcci applicativiDario Catalano
 
SaaS con Symfony2 un caso *molto* concreto di applicazione multitenant
SaaS con Symfony2 un caso *molto* concreto di applicazione multitenantSaaS con Symfony2 un caso *molto* concreto di applicazione multitenant
SaaS con Symfony2 un caso *molto* concreto di applicazione multitenantTassi Francesco
 
E suap - tecnologie client
E suap - tecnologie client E suap - tecnologie client
E suap - tecnologie client Sabino Labarile
 
Xamarin.Forms Performance Tips & Tricks - Francesco Bonacci - Codemotion Rome...
Xamarin.Forms Performance Tips & Tricks - Francesco Bonacci - Codemotion Rome...Xamarin.Forms Performance Tips & Tricks - Francesco Bonacci - Codemotion Rome...
Xamarin.Forms Performance Tips & Tricks - Francesco Bonacci - Codemotion Rome...Codemotion
 
PostgrSQL 9.3&9.4 - DjangoVillage
PostgrSQL 9.3&9.4 - DjangoVillagePostgrSQL 9.3&9.4 - DjangoVillage
PostgrSQL 9.3&9.4 - DjangoVillageMiriade Spa
 
Java EE facile con Spring Boot - Luigi Bennardis - Codemotion Roma 2015
Java EE facile con Spring Boot - Luigi Bennardis - Codemotion Roma 2015Java EE facile con Spring Boot - Luigi Bennardis - Codemotion Roma 2015
Java EE facile con Spring Boot - Luigi Bennardis - Codemotion Roma 2015Codemotion
 
Dominare il codice legacy
Dominare il codice legacyDominare il codice legacy
Dominare il codice legacyTommaso Torti
 
SQL Server Modern Query Processing
SQL Server Modern Query ProcessingSQL Server Modern Query Processing
SQL Server Modern Query ProcessingGianluca Hotz
 
KDE Plasma widgets
KDE Plasma widgetsKDE Plasma widgets
KDE Plasma widgetsPietro Lerro
 
Stanco delle solite Web App? Passa al Prgressive
Stanco delle solite Web App? Passa al PrgressiveStanco delle solite Web App? Passa al Prgressive
Stanco delle solite Web App? Passa al PrgressiveCommit University
 

Ähnlich wie Spring, IBatis e Transazioni Aop Nel Jug Avis Web (20)

Sviluppo web con Ruby on Rails
Sviluppo web con Ruby on RailsSviluppo web con Ruby on Rails
Sviluppo web con Ruby on Rails
 
Seam unifies Java EE by Massimiliano Ciccazzo
Seam unifies Java EE by Massimiliano CiccazzoSeam unifies Java EE by Massimiliano Ciccazzo
Seam unifies Java EE by Massimiliano Ciccazzo
 
April 2010 - Seam unifies JEE5
April 2010 - Seam unifies JEE5April 2010 - Seam unifies JEE5
April 2010 - Seam unifies JEE5
 
How create a single page apps using html5 and javascript
How create a single page apps using html5 and javascript How create a single page apps using html5 and javascript
How create a single page apps using html5 and javascript
 
Oai Data Adapter
Oai Data AdapterOai Data Adapter
Oai Data Adapter
 
Apache Hadoop: Introduzione all’architettura ed approcci applicativi
Apache Hadoop: Introduzione all’architettura ed approcci applicativiApache Hadoop: Introduzione all’architettura ed approcci applicativi
Apache Hadoop: Introduzione all’architettura ed approcci applicativi
 
SaaS con Symfony2 un caso *molto* concreto di applicazione multitenant
SaaS con Symfony2 un caso *molto* concreto di applicazione multitenantSaaS con Symfony2 un caso *molto* concreto di applicazione multitenant
SaaS con Symfony2 un caso *molto* concreto di applicazione multitenant
 
E suap - tecnologie client
E suap - tecnologie client E suap - tecnologie client
E suap - tecnologie client
 
SaaS con Symfony2
SaaS con Symfony2SaaS con Symfony2
SaaS con Symfony2
 
Basi Di Dati 05
Basi Di Dati 05Basi Di Dati 05
Basi Di Dati 05
 
Xamarin.Forms Performance Tips & Tricks - Francesco Bonacci - Codemotion Rome...
Xamarin.Forms Performance Tips & Tricks - Francesco Bonacci - Codemotion Rome...Xamarin.Forms Performance Tips & Tricks - Francesco Bonacci - Codemotion Rome...
Xamarin.Forms Performance Tips & Tricks - Francesco Bonacci - Codemotion Rome...
 
PostgrSQL 9.3&9.4 - DjangoVillage
PostgrSQL 9.3&9.4 - DjangoVillagePostgrSQL 9.3&9.4 - DjangoVillage
PostgrSQL 9.3&9.4 - DjangoVillage
 
Introduzione a Struts
Introduzione a StrutsIntroduzione a Struts
Introduzione a Struts
 
Java EE facile con Spring Boot - Luigi Bennardis - Codemotion Roma 2015
Java EE facile con Spring Boot - Luigi Bennardis - Codemotion Roma 2015Java EE facile con Spring Boot - Luigi Bennardis - Codemotion Roma 2015
Java EE facile con Spring Boot - Luigi Bennardis - Codemotion Roma 2015
 
#dd12 grillo daniele_xpages_tips_tricks_rev2
#dd12 grillo daniele_xpages_tips_tricks_rev2#dd12 grillo daniele_xpages_tips_tricks_rev2
#dd12 grillo daniele_xpages_tips_tricks_rev2
 
Dominare il codice legacy
Dominare il codice legacyDominare il codice legacy
Dominare il codice legacy
 
SQL Server Modern Query Processing
SQL Server Modern Query ProcessingSQL Server Modern Query Processing
SQL Server Modern Query Processing
 
KDE Plasma widgets
KDE Plasma widgetsKDE Plasma widgets
KDE Plasma widgets
 
Stanco delle solite Web App? Passa al Prgressive
Stanco delle solite Web App? Passa al PrgressiveStanco delle solite Web App? Passa al Prgressive
Stanco delle solite Web App? Passa al Prgressive
 
XPages Tips & Tricks, #dd13
XPages Tips & Tricks, #dd13XPages Tips & Tricks, #dd13
XPages Tips & Tricks, #dd13
 

Mehr von Massimiliano Dessì

When Old Meets New: Turning Maven into a High Scalable, Resource Efficient, C...
When Old Meets New: Turning Maven into a High Scalable, Resource Efficient, C...When Old Meets New: Turning Maven into a High Scalable, Resource Efficient, C...
When Old Meets New: Turning Maven into a High Scalable, Resource Efficient, C...Massimiliano Dessì
 
Microservices in Go_Dessi_Massimiliano_Codemotion_2017_Rome
Microservices in Go_Dessi_Massimiliano_Codemotion_2017_Rome Microservices in Go_Dessi_Massimiliano_Codemotion_2017_Rome
Microservices in Go_Dessi_Massimiliano_Codemotion_2017_Rome Massimiliano Dessì
 
Dessi docker kubernetes paas cloud
Dessi docker kubernetes paas cloudDessi docker kubernetes paas cloud
Dessi docker kubernetes paas cloudMassimiliano Dessì
 
Web Marketing Training 2014 Community Online
Web Marketing Training 2014 Community OnlineWeb Marketing Training 2014 Community Online
Web Marketing Training 2014 Community OnlineMassimiliano Dessì
 
Vert.X like Node.js but polyglot and reactive on JVM
Vert.X like Node.js but polyglot and reactive on JVMVert.X like Node.js but polyglot and reactive on JVM
Vert.X like Node.js but polyglot and reactive on JVMMassimiliano Dessì
 
Reactive applications Linux Day 2013
Reactive applications Linux Day 2013Reactive applications Linux Day 2013
Reactive applications Linux Day 2013Massimiliano Dessì
 
Scala Italy 2013 extended Scalatra vs Spring MVC
Scala Italy 2013 extended Scalatra vs Spring MVCScala Italy 2013 extended Scalatra vs Spring MVC
Scala Italy 2013 extended Scalatra vs Spring MVCMassimiliano Dessì
 
Codemotion 2013 scalatra_play_spray
Codemotion 2013 scalatra_play_sprayCodemotion 2013 scalatra_play_spray
Codemotion 2013 scalatra_play_sprayMassimiliano Dessì
 
Why we cannot ignore functional programming
Why we cannot ignore functional programmingWhy we cannot ignore functional programming
Why we cannot ignore functional programmingMassimiliano Dessì
 
Three languages in thirty minutes
Three languages in thirty minutesThree languages in thirty minutes
Three languages in thirty minutesMassimiliano Dessì
 

Mehr von Massimiliano Dessì (20)

Code One 2018 maven
Code One 2018   mavenCode One 2018   maven
Code One 2018 maven
 
When Old Meets New: Turning Maven into a High Scalable, Resource Efficient, C...
When Old Meets New: Turning Maven into a High Scalable, Resource Efficient, C...When Old Meets New: Turning Maven into a High Scalable, Resource Efficient, C...
When Old Meets New: Turning Maven into a High Scalable, Resource Efficient, C...
 
Hacking Maven Linux day 2017
Hacking Maven Linux day 2017Hacking Maven Linux day 2017
Hacking Maven Linux day 2017
 
Microservices in Go_Dessi_Massimiliano_Codemotion_2017_Rome
Microservices in Go_Dessi_Massimiliano_Codemotion_2017_Rome Microservices in Go_Dessi_Massimiliano_Codemotion_2017_Rome
Microservices in Go_Dessi_Massimiliano_Codemotion_2017_Rome
 
Dessi docker kubernetes paas cloud
Dessi docker kubernetes paas cloudDessi docker kubernetes paas cloud
Dessi docker kubernetes paas cloud
 
Docker dDessi november 2015
Docker dDessi november 2015Docker dDessi november 2015
Docker dDessi november 2015
 
Docker linuxday 2015
Docker linuxday 2015Docker linuxday 2015
Docker linuxday 2015
 
Openshift linuxday 2014
Openshift linuxday 2014Openshift linuxday 2014
Openshift linuxday 2014
 
Web Marketing Training 2014 Community Online
Web Marketing Training 2014 Community OnlineWeb Marketing Training 2014 Community Online
Web Marketing Training 2014 Community Online
 
Vert.X like Node.js but polyglot and reactive on JVM
Vert.X like Node.js but polyglot and reactive on JVMVert.X like Node.js but polyglot and reactive on JVM
Vert.X like Node.js but polyglot and reactive on JVM
 
Reactive applications Linux Day 2013
Reactive applications Linux Day 2013Reactive applications Linux Day 2013
Reactive applications Linux Day 2013
 
Scala Italy 2013 extended Scalatra vs Spring MVC
Scala Italy 2013 extended Scalatra vs Spring MVCScala Italy 2013 extended Scalatra vs Spring MVC
Scala Italy 2013 extended Scalatra vs Spring MVC
 
Codemotion 2013 scalatra_play_spray
Codemotion 2013 scalatra_play_sprayCodemotion 2013 scalatra_play_spray
Codemotion 2013 scalatra_play_spray
 
Why we cannot ignore functional programming
Why we cannot ignore functional programmingWhy we cannot ignore functional programming
Why we cannot ignore functional programming
 
Scala linux day 2012
Scala linux day 2012 Scala linux day 2012
Scala linux day 2012
 
Three languages in thirty minutes
Three languages in thirty minutesThree languages in thirty minutes
Three languages in thirty minutes
 
MongoDB dessi-codemotion
MongoDB dessi-codemotionMongoDB dessi-codemotion
MongoDB dessi-codemotion
 
MongoDB Webtech conference 2010
MongoDB Webtech conference 2010MongoDB Webtech conference 2010
MongoDB Webtech conference 2010
 
RESTEasy
RESTEasyRESTEasy
RESTEasy
 
Spring Roo Internals Javaday IV
Spring Roo Internals Javaday IVSpring Roo Internals Javaday IV
Spring Roo Internals Javaday IV
 

Kürzlich hochgeladen

Alessio Mazzotti, Aaron Brancotti; Writer, Screenwriter, Director, UX, Autore...
Alessio Mazzotti, Aaron Brancotti; Writer, Screenwriter, Director, UX, Autore...Alessio Mazzotti, Aaron Brancotti; Writer, Screenwriter, Director, UX, Autore...
Alessio Mazzotti, Aaron Brancotti; Writer, Screenwriter, Director, UX, Autore...Associazione Digital Days
 
Edoardo Di Pietro – “Virtual Influencer vs Umano: Rubiamo il lavoro all’AI”
Edoardo Di Pietro – “Virtual Influencer vs Umano: Rubiamo il lavoro all’AI”Edoardo Di Pietro – “Virtual Influencer vs Umano: Rubiamo il lavoro all’AI”
Edoardo Di Pietro – “Virtual Influencer vs Umano: Rubiamo il lavoro all’AI”Associazione Digital Days
 
Luigi Di Carlo, CEO & Founder @Evometrika srl – “Ruolo della computer vision ...
Luigi Di Carlo, CEO & Founder @Evometrika srl – “Ruolo della computer vision ...Luigi Di Carlo, CEO & Founder @Evometrika srl – “Ruolo della computer vision ...
Luigi Di Carlo, CEO & Founder @Evometrika srl – “Ruolo della computer vision ...Associazione Digital Days
 
Federico Bottino, Lead Venture Builder – “Riflessioni sull’Innovazione: La Cu...
Federico Bottino, Lead Venture Builder – “Riflessioni sull’Innovazione: La Cu...Federico Bottino, Lead Venture Builder – “Riflessioni sull’Innovazione: La Cu...
Federico Bottino, Lead Venture Builder – “Riflessioni sull’Innovazione: La Cu...Associazione Digital Days
 
Alessandro Nasi, COO @Djungle Studio – “Cosa delegheresti alla copia di te st...
Alessandro Nasi, COO @Djungle Studio – “Cosa delegheresti alla copia di te st...Alessandro Nasi, COO @Djungle Studio – “Cosa delegheresti alla copia di te st...
Alessandro Nasi, COO @Djungle Studio – “Cosa delegheresti alla copia di te st...Associazione Digital Days
 
Daniele Lunassi, CEO & Head of Design @Eye Studios – “Creare prodotti e servi...
Daniele Lunassi, CEO & Head of Design @Eye Studios – “Creare prodotti e servi...Daniele Lunassi, CEO & Head of Design @Eye Studios – “Creare prodotti e servi...
Daniele Lunassi, CEO & Head of Design @Eye Studios – “Creare prodotti e servi...Associazione Digital Days
 
Gabriele Mittica, CEO @Corley Cloud – “Come creare un’azienda “nativa in clou...
Gabriele Mittica, CEO @Corley Cloud – “Come creare un’azienda “nativa in clou...Gabriele Mittica, CEO @Corley Cloud – “Come creare un’azienda “nativa in clou...
Gabriele Mittica, CEO @Corley Cloud – “Come creare un’azienda “nativa in clou...Associazione Digital Days
 
Mael Chiabrera, Software Developer; Viola Bongini, Digital Experience Designe...
Mael Chiabrera, Software Developer; Viola Bongini, Digital Experience Designe...Mael Chiabrera, Software Developer; Viola Bongini, Digital Experience Designe...
Mael Chiabrera, Software Developer; Viola Bongini, Digital Experience Designe...Associazione Digital Days
 
Programma Biennale Tecnologia 2024 Torino
Programma Biennale Tecnologia 2024 TorinoProgramma Biennale Tecnologia 2024 Torino
Programma Biennale Tecnologia 2024 TorinoQuotidiano Piemontese
 

Kürzlich hochgeladen (9)

Alessio Mazzotti, Aaron Brancotti; Writer, Screenwriter, Director, UX, Autore...
Alessio Mazzotti, Aaron Brancotti; Writer, Screenwriter, Director, UX, Autore...Alessio Mazzotti, Aaron Brancotti; Writer, Screenwriter, Director, UX, Autore...
Alessio Mazzotti, Aaron Brancotti; Writer, Screenwriter, Director, UX, Autore...
 
Edoardo Di Pietro – “Virtual Influencer vs Umano: Rubiamo il lavoro all’AI”
Edoardo Di Pietro – “Virtual Influencer vs Umano: Rubiamo il lavoro all’AI”Edoardo Di Pietro – “Virtual Influencer vs Umano: Rubiamo il lavoro all’AI”
Edoardo Di Pietro – “Virtual Influencer vs Umano: Rubiamo il lavoro all’AI”
 
Luigi Di Carlo, CEO & Founder @Evometrika srl – “Ruolo della computer vision ...
Luigi Di Carlo, CEO & Founder @Evometrika srl – “Ruolo della computer vision ...Luigi Di Carlo, CEO & Founder @Evometrika srl – “Ruolo della computer vision ...
Luigi Di Carlo, CEO & Founder @Evometrika srl – “Ruolo della computer vision ...
 
Federico Bottino, Lead Venture Builder – “Riflessioni sull’Innovazione: La Cu...
Federico Bottino, Lead Venture Builder – “Riflessioni sull’Innovazione: La Cu...Federico Bottino, Lead Venture Builder – “Riflessioni sull’Innovazione: La Cu...
Federico Bottino, Lead Venture Builder – “Riflessioni sull’Innovazione: La Cu...
 
Alessandro Nasi, COO @Djungle Studio – “Cosa delegheresti alla copia di te st...
Alessandro Nasi, COO @Djungle Studio – “Cosa delegheresti alla copia di te st...Alessandro Nasi, COO @Djungle Studio – “Cosa delegheresti alla copia di te st...
Alessandro Nasi, COO @Djungle Studio – “Cosa delegheresti alla copia di te st...
 
Daniele Lunassi, CEO & Head of Design @Eye Studios – “Creare prodotti e servi...
Daniele Lunassi, CEO & Head of Design @Eye Studios – “Creare prodotti e servi...Daniele Lunassi, CEO & Head of Design @Eye Studios – “Creare prodotti e servi...
Daniele Lunassi, CEO & Head of Design @Eye Studios – “Creare prodotti e servi...
 
Gabriele Mittica, CEO @Corley Cloud – “Come creare un’azienda “nativa in clou...
Gabriele Mittica, CEO @Corley Cloud – “Come creare un’azienda “nativa in clou...Gabriele Mittica, CEO @Corley Cloud – “Come creare un’azienda “nativa in clou...
Gabriele Mittica, CEO @Corley Cloud – “Come creare un’azienda “nativa in clou...
 
Mael Chiabrera, Software Developer; Viola Bongini, Digital Experience Designe...
Mael Chiabrera, Software Developer; Viola Bongini, Digital Experience Designe...Mael Chiabrera, Software Developer; Viola Bongini, Digital Experience Designe...
Mael Chiabrera, Software Developer; Viola Bongini, Digital Experience Designe...
 
Programma Biennale Tecnologia 2024 Torino
Programma Biennale Tecnologia 2024 TorinoProgramma Biennale Tecnologia 2024 Torino
Programma Biennale Tecnologia 2024 Torino
 

Spring, IBatis e Transazioni Aop Nel Jug Avis Web

  • 1. Spring, iBATIS e Transazioni AOP nel Jug Avis Web Massimiliano Dessì Frame S.r.l http://www.jugsardegna.org/vqwiki/jsp/Wiki?MassimilianoDessi Massimiliano Dessì, Spring, iBatis e Transazioni AOP nel Jug Avis Web. 1 Macomer, 28 Gennaio 2006
  • 2. Architettura Generale Jug Avis Web: Interamente Interface Driven Design sviluppato usando TDD (Test Driven Development) Massimiliano Dessì, Spring, iBatis e Transazioni AOP nel Jug Avis Web. 2 Macomer, 28 Gennaio 2006
  • 3. Data Access Tier: Soluzioni prese in considerazione per l'accesso a DB JDBC Hibernate iBatis Massimiliano Dessì, Spring, iBatis e Transazioni AOP nel Jug Avis Web. 3 Macomer, 28 Gennaio 2006
  • 4. JDBC: Pro - Ben Conosciuta, possibilità controllo fine sul Codice e su SQL Contro -Eccessiva Verbosità -Manutenzione con query complesse composte dinamicamente -Codice “boilerplate” con try-catch obbligatori -La classe DAO “deve” sapere di essere eseguita dentro una transazione e deve essere scritto di conseguenza Massimiliano Dessì, Spring, iBatis e Transazioni AOP nel Jug Avis Web. 4 Macomer, 28 Gennaio 2006
  • 5. Hibernate: Pro -ORM, ragionamento OO-LIKE , non SQL-LIKE -Tools per velocizzare generazione codice e files -Adatto con DB modificati spesso -Caching Contro -Non SQL-LIKE, no DBA Tuning -Necessario per il web l' uso del pattern Open Session in View -N+1 Select -Esperienza per controllo fine settaggi configurazione Licenza: GPL Massimiliano Dessì, Spring, iBatis e Transazioni AOP nel Jug Avis Web. 5 Macomer, 28 Gennaio 2006
  • 6. iBatis: Pro -Data Mapper, SQL separato dal codice, DBA Tuning -Semplicissimo da usare -Caching -Velocità rispetto ad ORM -Ora disponibile tool per generazione codice (Abator) -N+1 select evitabile scrivendo opportunamente le query Contro Non è ancora “famoso” e conosciuto Licenza: Apache Massimiliano Dessì, Spring, iBatis e Transazioni AOP nel Jug Avis Web. 6 Macomer, 28 Gennaio 2006
  • 7. iBatis configurazione con Spring <bean id=quot;jug4avisweb.sqlMapClientquot; class=quot;org.springframework.orm.ibatis.SqlMapClientFactoryBeanquot;> <property name=quot;configLocationquot;> <value>WEB-INF/jug-sqlMapConfig.xml</value> </property> </bean> <bean id=quot;jug4avisweb.dataSourcequot; class=quot;org.springframework.jndi.JndiObjectFactoryBeanquot;> <property name=quot;jndiNamequot;> <value>java:comp/env/jdbc/jug4avis</value> </property> </bean> <bean id=quot;transactionManagerquot; class=quot;org.springframework.jdbc.datasource.DataSourceTransactionManagerquot;> <property name=quot;dataSourcequot;><ref bean=quot;jug4avisweb.dataSourcequot;/></property> </bean> Massimiliano Dessì, Spring, iBatis e Transazioni AOP nel Jug Avis Web. 7 Macomer, 28 Gennaio 2006
  • 8. <?xml version=quot;1.0quot; encoding=quot;UTF-8quot; ?> <!DOCTYPE sqlMapConfig PUBLIC quot;-//iBATIS.com//DTD SQL Map Config 2.0//ENquot; quot;http://www.ibatis.com/dtd/sql-map-config-2.dtdquot;> <sqlMapConfig> <settings cacheModelsEnabled=quot;truequot; enhancementEnabled=quot;truequot; lazyLoadingEnabled=quot;falsequot; maxRequests=quot;64quot; maxSessions=quot;20quot; maxTransactions=quot;8quot; useStatementNamespaces=quot;falsequot; /> <sqlMap resource=quot;org/jugsardegna/avis/web/db/ibatis/CentroAvisDaoPostgres.xmlquot;/> <sqlMap resource=quot;org/jugsardegna/avis/web/db/ibatis/DonorDaoPostgres.xmlquot;/> </sqlMapConfig> File di configurazione jug4avisweb-sqlMapConfig.xml Massimiliano Dessì, Spring, iBatis e Transazioni AOP nel Jug Avis Web. 8 Macomer, 28 Gennaio 2006
  • 9. <?xml version=quot;1.0quot; encoding=quot;UTF-8quot; standalone=quot;noquot;?> <!DOCTYPE sqlMap PUBLIC quot;-//iBATIS.com//DTD SQL Map 2.0//ENquot; quot;http://www.ibatis.com/dtd/sql-map-2.dtdquot;> <sqlMap> <cacheModel id=quot;file-cachequot; type =quot;LRUquot; > <flushInterval hours=quot;24quot;/> <flushOnExecute statement=quot;insertCentroquot;/> <flushOnExecute statement=quot;deleteCentroquot;/> <flushOnExecute statement=quot;aggiornaCentroquot;/> <property name=quot;cache-sizequot; value=quot;1000quot; /> </cacheModel> <typeAlias type=quot;org.jugsardegna.avis.web.domain.CentroAvisquot; alias=quot;centroAvisquot;/> <resultMap class=quot;centroAvisquot; id=quot;resultCentroAvisquot;> <result property=quot;idquot; column=quot;idquot;/> <result property=quot;nomequot; column=quot;nomequot;/> <result property=quot;faxquot; column=quot;faxquot;/> <result property=quot;telefonoquot; column=quot;telefonoquot;/> <result property=quot;emailquot; column=quot;emailquot;/> <result property=quot;sitoWebquot; column=quot;sito_webquot;/> <result property=quot;localitaquot; column=quot;localitaquot;/> <result property=quot;creditoResiduoSmsquot; column=quot;credito_residuo_smsquot;/> <result property=quot;numeroDonatoriquot; column=quot;numero_donatoriquot;/> </resultMap> Massimiliano Dessì, Spring, iBatis e Transazioni AOP nel Jug Avis Web. 9 Macomer, 28 Gennaio 2006
  • 10. <select id=quot;getCentroAvisquot; resultMap=quot;resultCentroAvisquot;> SELECT * FROM centri_avis WHERE id= #value# ; </select> <delete id=quot;deleteCentroquot; parameterClass=quot;longquot;> DELETE FROM centri_avis WHERE id=#value# ; </delete> <insert id=quot;insertCentroquot; parameterClass=quot;centroAvisquot;> <selectKey keyProperty=quot;idquot; resultClass=quot;longquot;> select nextval('id_univoco') </selectKey> INSERT INTO centri_avis (id, nome, localita, telefono, email, fax, sito_web, credito_residuo_sms, numero_donatori) VALUES ( #id#, #nome#, #localita#, #telefono#, #email#, #fax#, #sitoWeb#, #creditoResiduoSms#, #numeroDonatori#); </insert> <update id=quot;aggiornaCentroquot; parameterClass=quot;centroAvisquot;> UPDATE centri_avis SET nome = #nome# , telefono = #telefono#, email = #email#, fax =#fax#, sito_web = #sitoWeb#, localita = #localita#, credito_residuo_sms = #creditoResiduoSms#, numero_donatori = #numeroDonatori# WHERE Id = #id# ; </update> </sqlMap> File di configurazione CentroAvisDaoPostgres.xml Massimiliano Dessì, Spring, iBatis e Transazioni AOP nel Jug Avis Web. 10 Macomer, 28 Gennaio 2006
  • 11. iBatis DAO (1) SqlMapCentroAvisDao public class SqlMapCentroAvisDao extends SqlMapClientDaoSupport implements ICentroAvisDao{ public List getCentriAvis(){ return getSqlMapClientTemplate().queryForList(quot;getCentriAvisquot;, null); } public CentroAvis getCentro(long idCentroAvis){ return (CentroAvis)getSqlMapClientTemplate(). queryForObject(quot;getCentroAvisquot;, new Long(idCentroAvis)); } Massimiliano Dessì, Spring, iBatis e Transazioni AOP nel Jug Avis Web. 11 Macomer, 28 Gennaio 2006
  • 12. iBatis DAO (2) public long insertCentroAvis(CentroAvis centro){ return ((Long)getSqlMapClientTemplate(). insert(quot;insertCentroquot;, centro)).longValue(); } public int updateCentroAvis(CentroAvis centro){ return ((Integer)getSqlMapClientTemplate(). update(quot;aggiornaCentroquot;, centro)).intValue(); } public int deleteCentroAvis(long idCentroAvis){ return ((Integer)getSqlMapClientTemplate(). delete(quot;deleteCentroquot;, idCentroAvis)).intValue(); } } Massimiliano Dessì, Spring, iBatis e Transazioni AOP nel Jug Avis Web. 12 Macomer, 28 Gennaio 2006
  • 13. - I dao non sanno minimamente di essere dentro una transazione o meno - non siamo obbligati a gestire try-catch (naturalmente in una altra parte della applicazione, verranno tracciate e gestite convenientemente in caso vengano lanciate eccezioni) - Le query sono separate e facili da modificare Massimiliano Dessì, Spring, iBatis e Transazioni AOP nel Jug Avis Web. 13 Macomer, 28 Gennaio 2006
  • 14. Transazioni (obiettivo) Vogliamo fare in modo che alcuni metodi vengano eseguiti come unità atomiche di lavoro: - Senza modiche nel codice in maniera che siano metodi riutilizzabili - Senza scrivere codice, ma dichiarando (Declarative Transaction Demarcation) semplicemente quali metodi e con quali livelli di scope Nota: Le transazioni di cui necessitiamo sono su un datasource locale, non distribuito. Massimiliano Dessì, Spring, iBatis e Transazioni AOP nel Jug Avis Web. 14 Macomer, 28 Gennaio 2006
  • 15. Per realizzare i nostri obiettivi usiamo il supporto per utilizzare l'AOP (Aspect Oriented Programming) per mezzo di Spring. Con AspectJ o con classi Java che fungano da Proxy In questa brevissima presentazione vedremo il secondo caso, di più facile comprensione. Nota: AspectJ verrà usato nel Jug Avis Web con l'uscita della versione 2.0 di Spring nella primavera 2006 Massimiliano Dessì, Spring, iBatis e Transazioni AOP nel Jug Avis Web. 15 Macomer, 28 Gennaio 2006
  • 16. Brevissima spiegazione sull' AOP: -Separazione delle competenze trasversali -Complementare all' OO es. Nelle classi, dove è necessario il logging, ad esempio il tracciamento delle eccezioni, viene richiamato un Logger (staticamente o con l' IOC ), e viene eseguito il tracciamento Con la programmazione ad Aspetti scriviamo solo una volta il modulo (Aspect) e nella sua dichiarazione diciamo quando deve essere eseguito. Se usiamo AspectJ, durante la “compilazione” (weaving), l' aspect weaver (compilatore compone il sistema finale legando i nostri moduli trasversali (aspects) . Naturalmente questo processo produce bytecode standard per la virtual machine. Il logger sparisce dalle classi dove lo avremmo dovuto mettere per poterlo usare con il solo uso dell' OO. Possiamo anzi, creare anche un aspect che gestisca il lancio delle eccezioni ! Massimiliano Dessì, Spring, iBatis e Transazioni AOP nel Jug Avis Web. 16 Macomer, 28 Gennaio 2006
  • 17. Grazie all' AOP possiamo modularizzare le competenze trasversali che altrimenti con la programmazione ad Oggetti “tradizionale” sarebbero presenti in tutte le classi in cui sono necessarie. Vediamo invece ora come è possibile “emulare” il funzionamento di AspectJ, con delle classi proxy usando il pattern Proxy e Decorator. Naturalmente il funzionamento con le classi proxy, è conforme alle interfacce della AOP Alliance, per poter essere interoperabile tra le varie implementazioni AOP. Il funzionamento con i Proxy di SpringAOP, ruota attorno all' uso di una catena di intercettori tra l'oggetto chiamante e quello invocato. Ogni elemento della catena ha la possibilità di interporre logica prima della invocazione, dopo l'invocazione, o circuitare anche l' invocazione. Massimiliano Dessì, Spring, iBatis e Transazioni AOP nel Jug Avis Web. 17 Macomer, 28 Gennaio 2006
  • 18. Massimiliano Dessì, Spring, iBatis e Transazioni AOP nel Jug Avis Web. 18 Macomer, 28 Gennaio 2006
  • 19. Ora che abbiamo spiegato in maniera molto veloce lo scopo dell' AOP, vediamo come possiamo usarlo nel JUG Avis per le Transazioni. Prendiamo come esempio la classe ManagerCentriAvis, dove, quando un centro deve essere eliminato, deve eliminare nella stessa transazione anche i donatori di quel centro. Perciò questa classe sarà la classe target. Come Proxy usiamo un classe predefinita fornita da Spring: TransactionProxyFactoryBean (AOP Proxy di pag. 18) che per fare il suo lavoro ha bisogno dell' iniezione di -TransactionManager -Target (ManagerCentriAvis) -TransactionAttributes (nomi o pattern ai quali applicare la transazionalità) Nella parte dei TransactionAttributes possiamo definire la propagazione della transazione, il livello di isolamento, il timeout e il flag readOnly. Nota: Se avessimo bisogno di dichiarare più manager useremmo una altra tecnica. Massimiliano Dessì, Spring, iBatis e Transazioni AOP nel Jug Avis Web. 19 Macomer, 28 Gennaio 2006
  • 20. <bean id=quot;jug4avisweb.managerCentriAvisTargetquot; class=quot;org.jugsardegna.avis.web.service.impl.ManagerCentriAvisquot;> <property name=quot;centroAvisDaoquot;><ref bean=quot;jug4avisweb.centroAvisDaoquot;/></property> <property name=quot;managerDonorsquot;><ref bean=quot;jug4avisweb.managerDonorquot;/></property> </bean> <bean id=quot;jug4avisweb.managerCentriAvisquot; class=quot;org.springframework.transaction.interceptor.TransactionProxyFactoryBeanquot;> <property name=quot;transactionManagerquot;> <ref bean=quot;transactionManagerquot;/> </property> <property name=quot;targetquot;> <ref bean=quot;jug4avisweb.managerCentriAvisTargetquot;/> </property> <property name=quot;transactionAttributesquot;> <props> <prop key=quot;insert*quot;>PROPAGATION_REQUIRED</prop> <prop key=quot;update*quot;>PROPAGATION_REQUIRED</prop> <prop key=quot;delete*quot;>PROPAGATION_REQUIRED</prop> </props> </property> </bean> Massimiliano Dessì, Spring, iBatis e Transazioni AOP nel Jug Avis Web. 20 Macomer, 28 Gennaio 2006
  • 21. Transaction Attributes: PROPAGATION_REQUIRED : Supporta la transazione esistente, Se non esiste ne crea una nuova PROPAGATION_SUPPORTS: Supporta la transazione esistente, Se non esiste esegue non transazionalmente PROPAGATION_MANDATORY:Supporta la transazione esistente, Se non esiste lancia una eccezione PROPAGATION_REQUIRES_NEW:Fa partire sempre una nuova transazione, se ne esiste già una la sospende. PROPAGATION_NOT_SUPPORTED:Non viene eseguito se esiste una transazione attiva. Eseguito sempre non transaz.e sospende quelle attive. PROPAGATION_NEVER: Eseguito non transazionalmente, viene lanciata na eccezione se esiste una transazione attiva. PROPAGATION_NESTED:Eseguito in una transazione annidata se ne esiste una, altrimenti, viene eseguita come propagation_required. Massimiliano Dessì, Spring, iBatis e Transazioni AOP nel Jug Avis Web. 21 Macomer, 28 Gennaio 2006
  • 22. Riferimenti 1 Spring : http://www.springframework.org Nel Jug Sardegna (Articoli, Recensioni Libri): http://www.jugsardegna.org/vqwiki/jsp/Wiki?SpringFramework Jug Avis: http://www.jugsardegna.org/vqwiki/jsp/Wiki?JugAvis Jug Avis Web (prima parte): http://www.jugsardegna.org/vqwiki/jsp/Wiki?action=action_view_attachment &attachment=Spring_webflowJug16Luglio2005.pdf Massimiliano Dessì, Spring, iBatis e Transazioni AOP nel Jug Avis Web. 22 Macomer, 28 Gennaio 2006
  • 23. Riferimenti 2 IBatis : http://ibatis.apache.org/ Nel Jug Sardegna: http://www.jugsardegna.org/vqwiki/jsp/Wiki?IBatisCaseStudy Abator for iBatis: http://ibatis.apache.org/abator.html Massimiliano Dessì, Spring, iBatis e Transazioni AOP nel Jug Avis Web. 23 Macomer, 28 Gennaio 2006
  • 24. Riferimenti 3 AspectJ: http://www.eclipse.org/aspectj/ Aspect-Oriented Software Development AOSD http://www.aosd.net/ AspectJ in Action http://www.manning.com/books/laddad Massimiliano Dessì, Spring, iBatis e Transazioni AOP nel Jug Avis Web. 24 Macomer, 28 Gennaio 2006
  • 25. Grazie per l'attenzione. Massimiliano Dessì, Spring, iBatis e Transazioni AOP nel Jug Avis Web. 25 Macomer, 28 Gennaio 2006