SlideShare a Scribd company logo
Introduzione a Spring
JUG Genova Meeting
18/09/2007
Corrado Alesso – Carlo Bonamico
Cos'è?
Spring è un framework che semplifica
lo sviluppo di applicazioni Java
e in particolare J2EE
 promuovendo l'uso di best practice di design
 secondo un modello di sviluppo POJO-based
Plain Old Java Object
Storia
Rod Johnson scrive, nel 2002, il libro Expert One-on-
One J2EE Design and Development in cui vengono
delineati i limiti di J2EE e proposti pattern architetturali
che sono alla base di Spring
Il progetto Spring nasce dai sorgenti descritti nel libro e
diventa un progetto Open Source ufficialmente nel
2003 su SourceForge
Spring 2.0 esce nel 2006
attualmente in attesa di Spring 2.5 :-)
Overview
Principi Architetturali
 Inversion of Control
− è il framework che chiama il mio codice e non
viceversa
 Dependency Injection
− il singolo oggetto dichiara le proprie dipendenze,
ma non le istanzia/cerca
− è il framework che le risolve, istanzia e ritorna
Inversion of Control (IoC)
The “Hollywood Principle”
Don't call me, I'll call you
Ribaltamento di responsabilita' tra due entità
L'entità più astratta invoca i metodi
dell’entità più concreta
Esempio: in un GUI framework, è la classe Button che crea gli
eventi e chiama gli event handler definiti da me per
notificarglieli, non sono le mie classi che chiedono a Button
se ci sono eventi da gestire
Lo dicevano i
produttori di
Hollywood agli
aspiranti attori
:-)
Realizzare un’ architettura
modulare: problemi

Gli oggetti dipendono gli uni dagli altri
− ad esempio un servizio A ha bisogno di un servizio B

In prima battuta, posso disaccoppiarli definendo
un'interfaccia IB che B implementa
− scrivo il codice di A in funzione di IB invece che di B

Problema: da qualche parte, qualcuno deve fare
− IB b = new B();
Chi lo fa?
Inversion of Control
e gestione delle dipendenze
 Approccio del newbie
Scrivere wiring code (difficilmente manutenibile) per rendere
disponibili gli oggetti tra loro
● A crea B
 Approccio tradizionale
“Framework/Container, dammi l'oggetto X, mi serve”
● A chiede B al container (es. JNDI)
● A chiede B ad un singleton/registry
 IoC
“Applicazione, tieni l'oggetto X, ti serve”
● Il container crea B e lo passa ad A
Dependency Injection (DI)
Dependency Injection e' un tipo particolare di IoC
per cui le dipendenze di un oggetto (i suoi
collaboratori) vengono “iniettate” nell'istanza
automaticamente e a runtime, utilizzando costrutti
Java standard
 Costruttori
 Metodi
 Setter di JavaBean properties
E' il framework a chiamare il codice,
non viceversa
Esempio
Eclipse...
Vantaggi
 Non è più necessario scrivere wiring code
− è più facile riconfigurare l'applicazione
 I componenti sono più semplici da scrivere,
manutenere e riutilizzare
 Il mio codice non dipende dal framework
− posso riutilizzare le stesse classi in altri contesti
− posso testarle più facilmente, anche perché sono meno
accoppiate tra loro
BeanFactory
Il modulo principale di Spring, su cui si basa
l'intero framework, è un IoC container che
implementa DI: la BeanFactory
Le dipendenze vengono specificate tramite:
 XML
 Annotazioni
 Codice Java
Esempio di configurazione
<beans>
<bean id="myDataSource"
class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName"
value="com.mysql.jdbc.Driver" />
</bean>
<bean id="myDAO" class="example.MyDAO">
<property name="dataSource" ref="myDataSource" />
</bean>
<bean id="myBusinessObject"
class="example.MyBusinessObject">
<property name="dataAccessObject" ref="myDAO" />
<property name="exampleParam"><value>10</value></property>
<property name="list">
<list>
<value>10</value><value>15</value>
</list>
</property>
</bean>
</beans>
Bean Factory
Lo sviluppatore non e' tenuto a interagire
direttamente con i meccanismi di IoC/DI
Puo' interfacciarsi alla BeanFactory, che
permette di ottenere referenze a componenti
già configurati e relazionati ai loro eventuali
collaboratori (configurati a loro volta)
ApplicationContext
 Una versione più sofisticata della BeanFactory
(la estende...) con servizi aggiuntivi
− accesso trasparente a risorse (URL, file, classpath)
 Può inizializzare il context
− da filesystem
− da file presente nel classpath (utile se dentro jar)
− a mano
 Esistono ApplicationContext specializzati per
diverse tipologie di applicazioni
− es. WebApplicationContext
Spring solo per Java EE?
Spring non dipende da nessuna API Java EE,
pertanto e' utilizzabile sia all'interno che
all'esterno di un Application Server
Esempio
Eclipse...
Gli altri moduli di Spring
DAO
ORM
AOP (vedi presentazione di Fabio)
J2EE
Web (MVC)
Spring DAO: Problemi di JDBC
 Codice ripetitivo e verboso
necessario per gestire correttamente
ResultSet, Statement e Connection
e garantire la chiusura delle connessioni
in caso di eccezioni
(fonte di errori e inefficenze)
 SQLException che significa tutto e niente
ingloba situazioni di errore molto diverse
Spring DAO
Spring risolve i problemi citati
(con overhead trascurabile)
 Fornisce oggetti JdbcTemplate che
incapsulano il codice ripetitivo come il corretto
rilascio delle risorse
JdbcTemplate template = new JdbcTemplate(dataSource);
List names = template.query("SELECT name FROM user");
 Rimappa le SQLException in una gerarchia
di (unchecked) eccezioni significative
ORM – Hibernate senza Spring
public List findCityByCountry (String country) throws Exception
{
SessionFactory sessionFactory = ...
Session s = null;
try {
s = sessionFactory.openSession();
Query q = s.createQuery(
“select City c from City where c.country = :country”);
q.setString(“country”, country);
return q.list();
} catch (Exception e)
{ ...
} finally {
s.close();
}
}
ORM – Hibernate con Spring
public List findCityByCountry (String country) {
return getHibernateTemplate().find(
“from City where country = :country”, “country”, country);
}
Testing
Spring facilita il testing attraverso tre meccanismi
− disaccoppiando le classi, rende più semplice la scrittura
degli unit test
 eventuale uso di Mock Object
− fornendo dependency injection trasparente ai test di
integrazione
 classe AbstractDependencyInjectionSpringContextTests
− fornendo meccanismo di transaction management di test
che simula le transazioni su un DB annullandole alla fine
di ogni test
 classe AbstractTransactionalDataSourceSpringContextTests
AbstractDependencyInjectionSpringContextTests
 Ridefinisco il metodo
protected String[] getConfigLocations() {
return new String[]
{"classpath:testApplicationContext.xml"};
}
 Utilizzo la variabile membro applicationContext per
accedere alla BeanFactory
applicationContext.getBean("aDao");
 Oppure dichiaro variabili membro protected che si
chiamano come i bean che mi servono
− popolate automaticamente da Spring in fase di
inizializzazione del test se nel costruttore invoco
setPopulateProtectedVariables(true);
AbstractTransactionalDataSourceSpringContextTests
 Ogni metodo di test viene eseguito in una
transazione
− inizializzata durante la setUp()
 Alla fine del metodo, la transazione viene
automaticamente annullata
− per riportare il DB nello stato originale
− questo a meno che non chiamo il metodo
setComplete()
Spring - punti di forza
 Codice piu' modulare e sintetico
 I molti moduli di Spring possono essere usati
separatamente, decidendo incrementalmente
quali e quando
 L'applicazione risulta riconfigurabile senza
bisogno di ricompilare
(supporto anche per bean scritti in scripting languages)
Riferimenti
Spring
http://www.springframework.org
Il principale articolo su Dependency Injection
http://www.martinfowler.com/articles/injection.html
Introduction to Spring
http://www.theserverside.com/tt/articles/article.tss?l=SpringFramework
Link alla presentazione di Fabio Bonfante su AOP
http://www.slideshare.net/bfx81/introducin-aop
Spring plugin per Eclipse
http://springide.org/blog/
Q&A
GRAZIE per l'attenzione!

More Related Content

PDF
Modulo 6 Spring Framework Core E Aop
PPT
Spring 2.5
PDF
SPRING - MAVEN - REST API (ITA - Luglio 2017)
PDF
Un backend per tutte le stagioni con Spring
ODP
Spring Framework
PDF
Java Spring Basics - Donato Andrisani - Gabriele Manfredi
PDF
Spring @Aspect e @Controller
PPTX
Mvc e di spring e angular js
Modulo 6 Spring Framework Core E Aop
Spring 2.5
SPRING - MAVEN - REST API (ITA - Luglio 2017)
Un backend per tutte le stagioni con Spring
Spring Framework
Java Spring Basics - Donato Andrisani - Gabriele Manfredi
Spring @Aspect e @Controller
Mvc e di spring e angular js

What's hot (20)

PPTX
Spring - Ecosistema
PPTX
Microservices
PPTX
Dependency Injection
PPTX
Java EE facile con Spring Boot - Luigi Bennardis - Codemotion Roma 2015
PDF
Progetto SOD Davide Sito
PPT
Java lezione 18
PDF
Acadevmy - Angular Overview
PPT
Java lezione 17
PDF
OSGi e Liferay 7
PDF
Struttin' on, novità in casa Struts
PDF
Introduzione agli Hooks – Primo Episodio
PDF
Introduzione ad angular 7/8
ODP
SCBCD 1. generic ejb
PDF
Corso introduttivo di Design Pattern in Java per Elis - 1
PDF
Hands on MVC - Mastering the Web
PPTX
Novità di Asp.Net 4.0
PDF
Dependency injection questa sconosciuta
PDF
MVC and Struts 1
PDF
Maven - Aprile 2010
PPT
Struts - Overview, Installazione e Setup
Spring - Ecosistema
Microservices
Dependency Injection
Java EE facile con Spring Boot - Luigi Bennardis - Codemotion Roma 2015
Progetto SOD Davide Sito
Java lezione 18
Acadevmy - Angular Overview
Java lezione 17
OSGi e Liferay 7
Struttin' on, novità in casa Struts
Introduzione agli Hooks – Primo Episodio
Introduzione ad angular 7/8
SCBCD 1. generic ejb
Corso introduttivo di Design Pattern in Java per Elis - 1
Hands on MVC - Mastering the Web
Novità di Asp.Net 4.0
Dependency injection questa sconosciuta
MVC and Struts 1
Maven - Aprile 2010
Struts - Overview, Installazione e Setup
Ad

Similar to Spring Intro (20)

PDF
"Java Spring" by Donato Andrisani e Gabriele Manfredi
PDF
Spring20 Javaday
PPTX
Design Pattern Architetturali - Dependency Injection
PPTX
Inversion of control e Dependency Injection (ITA)
PDF
Real Spring Aop Recipes For Your Everyday Job
PPTX
Entity Framework 4 vs NHibernate 3
PPTX
Dependency Injection and Inversion Of Control
PPTX
Design pattern architetturali Model View Controller, MVP e MVVM
PPTX
Inversion of Control @ CD2008
PPT
Sviluppo Rapido Di Applicazioni Con Grails
ODP
Presentazione review it_20min
PDF
PPTX
Il web 2.0
PPTX
Dal requisito all'implementazione @ CD2010
PDF
Spring e Flex
PDF
The Hitchhiker's Guide to testable code: semplici regole per scrivere codice ...
PDF
Spring E Spring Web Flow Nel Progetto Jug Avis Web
PPTX
NHibernate in Action (Parte 2)
PPTX
Lo sai che si può fare DDD in Javascript grazie a Typescript? Visual Studio e...
PPSX
Entity Framework 4.0 vs NHibernate
"Java Spring" by Donato Andrisani e Gabriele Manfredi
Spring20 Javaday
Design Pattern Architetturali - Dependency Injection
Inversion of control e Dependency Injection (ITA)
Real Spring Aop Recipes For Your Everyday Job
Entity Framework 4 vs NHibernate 3
Dependency Injection and Inversion Of Control
Design pattern architetturali Model View Controller, MVP e MVVM
Inversion of Control @ CD2008
Sviluppo Rapido Di Applicazioni Con Grails
Presentazione review it_20min
Il web 2.0
Dal requisito all'implementazione @ CD2010
Spring e Flex
The Hitchhiker's Guide to testable code: semplici regole per scrivere codice ...
Spring E Spring Web Flow Nel Progetto Jug Avis Web
NHibernate in Action (Parte 2)
Lo sai che si può fare DDD in Javascript grazie a Typescript? Visual Studio e...
Entity Framework 4.0 vs NHibernate
Ad

Spring Intro

  • 1. Introduzione a Spring JUG Genova Meeting 18/09/2007 Corrado Alesso – Carlo Bonamico
  • 2. Cos'è? Spring è un framework che semplifica lo sviluppo di applicazioni Java e in particolare J2EE  promuovendo l'uso di best practice di design  secondo un modello di sviluppo POJO-based Plain Old Java Object
  • 3. Storia Rod Johnson scrive, nel 2002, il libro Expert One-on- One J2EE Design and Development in cui vengono delineati i limiti di J2EE e proposti pattern architetturali che sono alla base di Spring Il progetto Spring nasce dai sorgenti descritti nel libro e diventa un progetto Open Source ufficialmente nel 2003 su SourceForge Spring 2.0 esce nel 2006 attualmente in attesa di Spring 2.5 :-)
  • 5. Principi Architetturali  Inversion of Control − è il framework che chiama il mio codice e non viceversa  Dependency Injection − il singolo oggetto dichiara le proprie dipendenze, ma non le istanzia/cerca − è il framework che le risolve, istanzia e ritorna
  • 6. Inversion of Control (IoC) The “Hollywood Principle” Don't call me, I'll call you Ribaltamento di responsabilita' tra due entità L'entità più astratta invoca i metodi dell’entità più concreta Esempio: in un GUI framework, è la classe Button che crea gli eventi e chiama gli event handler definiti da me per notificarglieli, non sono le mie classi che chiedono a Button se ci sono eventi da gestire Lo dicevano i produttori di Hollywood agli aspiranti attori :-)
  • 7. Realizzare un’ architettura modulare: problemi  Gli oggetti dipendono gli uni dagli altri − ad esempio un servizio A ha bisogno di un servizio B  In prima battuta, posso disaccoppiarli definendo un'interfaccia IB che B implementa − scrivo il codice di A in funzione di IB invece che di B  Problema: da qualche parte, qualcuno deve fare − IB b = new B(); Chi lo fa?
  • 8. Inversion of Control e gestione delle dipendenze  Approccio del newbie Scrivere wiring code (difficilmente manutenibile) per rendere disponibili gli oggetti tra loro ● A crea B  Approccio tradizionale “Framework/Container, dammi l'oggetto X, mi serve” ● A chiede B al container (es. JNDI) ● A chiede B ad un singleton/registry  IoC “Applicazione, tieni l'oggetto X, ti serve” ● Il container crea B e lo passa ad A
  • 9. Dependency Injection (DI) Dependency Injection e' un tipo particolare di IoC per cui le dipendenze di un oggetto (i suoi collaboratori) vengono “iniettate” nell'istanza automaticamente e a runtime, utilizzando costrutti Java standard  Costruttori  Metodi  Setter di JavaBean properties E' il framework a chiamare il codice, non viceversa
  • 11. Vantaggi  Non è più necessario scrivere wiring code − è più facile riconfigurare l'applicazione  I componenti sono più semplici da scrivere, manutenere e riutilizzare  Il mio codice non dipende dal framework − posso riutilizzare le stesse classi in altri contesti − posso testarle più facilmente, anche perché sono meno accoppiate tra loro
  • 12. BeanFactory Il modulo principale di Spring, su cui si basa l'intero framework, è un IoC container che implementa DI: la BeanFactory Le dipendenze vengono specificate tramite:  XML  Annotazioni  Codice Java
  • 13. Esempio di configurazione <beans> <bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="com.mysql.jdbc.Driver" /> </bean> <bean id="myDAO" class="example.MyDAO"> <property name="dataSource" ref="myDataSource" /> </bean> <bean id="myBusinessObject" class="example.MyBusinessObject"> <property name="dataAccessObject" ref="myDAO" /> <property name="exampleParam"><value>10</value></property> <property name="list"> <list> <value>10</value><value>15</value> </list> </property> </bean> </beans>
  • 14. Bean Factory Lo sviluppatore non e' tenuto a interagire direttamente con i meccanismi di IoC/DI Puo' interfacciarsi alla BeanFactory, che permette di ottenere referenze a componenti già configurati e relazionati ai loro eventuali collaboratori (configurati a loro volta)
  • 15. ApplicationContext  Una versione più sofisticata della BeanFactory (la estende...) con servizi aggiuntivi − accesso trasparente a risorse (URL, file, classpath)  Può inizializzare il context − da filesystem − da file presente nel classpath (utile se dentro jar) − a mano  Esistono ApplicationContext specializzati per diverse tipologie di applicazioni − es. WebApplicationContext
  • 16. Spring solo per Java EE? Spring non dipende da nessuna API Java EE, pertanto e' utilizzabile sia all'interno che all'esterno di un Application Server
  • 18. Gli altri moduli di Spring DAO ORM AOP (vedi presentazione di Fabio) J2EE Web (MVC)
  • 19. Spring DAO: Problemi di JDBC  Codice ripetitivo e verboso necessario per gestire correttamente ResultSet, Statement e Connection e garantire la chiusura delle connessioni in caso di eccezioni (fonte di errori e inefficenze)  SQLException che significa tutto e niente ingloba situazioni di errore molto diverse
  • 20. Spring DAO Spring risolve i problemi citati (con overhead trascurabile)  Fornisce oggetti JdbcTemplate che incapsulano il codice ripetitivo come il corretto rilascio delle risorse JdbcTemplate template = new JdbcTemplate(dataSource); List names = template.query("SELECT name FROM user");  Rimappa le SQLException in una gerarchia di (unchecked) eccezioni significative
  • 21. ORM – Hibernate senza Spring public List findCityByCountry (String country) throws Exception { SessionFactory sessionFactory = ... Session s = null; try { s = sessionFactory.openSession(); Query q = s.createQuery( “select City c from City where c.country = :country”); q.setString(“country”, country); return q.list(); } catch (Exception e) { ... } finally { s.close(); } }
  • 22. ORM – Hibernate con Spring public List findCityByCountry (String country) { return getHibernateTemplate().find( “from City where country = :country”, “country”, country); }
  • 23. Testing Spring facilita il testing attraverso tre meccanismi − disaccoppiando le classi, rende più semplice la scrittura degli unit test  eventuale uso di Mock Object − fornendo dependency injection trasparente ai test di integrazione  classe AbstractDependencyInjectionSpringContextTests − fornendo meccanismo di transaction management di test che simula le transazioni su un DB annullandole alla fine di ogni test  classe AbstractTransactionalDataSourceSpringContextTests
  • 24. AbstractDependencyInjectionSpringContextTests  Ridefinisco il metodo protected String[] getConfigLocations() { return new String[] {"classpath:testApplicationContext.xml"}; }  Utilizzo la variabile membro applicationContext per accedere alla BeanFactory applicationContext.getBean("aDao");  Oppure dichiaro variabili membro protected che si chiamano come i bean che mi servono − popolate automaticamente da Spring in fase di inizializzazione del test se nel costruttore invoco setPopulateProtectedVariables(true);
  • 25. AbstractTransactionalDataSourceSpringContextTests  Ogni metodo di test viene eseguito in una transazione − inizializzata durante la setUp()  Alla fine del metodo, la transazione viene automaticamente annullata − per riportare il DB nello stato originale − questo a meno che non chiamo il metodo setComplete()
  • 26. Spring - punti di forza  Codice piu' modulare e sintetico  I molti moduli di Spring possono essere usati separatamente, decidendo incrementalmente quali e quando  L'applicazione risulta riconfigurabile senza bisogno di ricompilare (supporto anche per bean scritti in scripting languages)
  • 27. Riferimenti Spring http://www.springframework.org Il principale articolo su Dependency Injection http://www.martinfowler.com/articles/injection.html Introduction to Spring http://www.theserverside.com/tt/articles/article.tss?l=SpringFramework Link alla presentazione di Fabio Bonfante su AOP http://www.slideshare.net/bfx81/introducin-aop Spring plugin per Eclipse http://springide.org/blog/