Slideshare.net (beta)

 
Post to TwitterPost to Twitter
Post: 
Myspace Hi5 Friendster Xanga LiveJournal Facebook Blogger Tagged Typepad Freewebs BlackPlanet gigya icons

All comments

Add a comment on Slide 1

If you have a SlideShare account, login to comment; else you can comment as a guest


Showing 1-50 of 1 (more)

Spring Intro

From guestfb22d3, 2 years ago

Introduzione a Spring - JugGenova 18/09/07 di Corrado e Carlo

2763 views  |  0 comments  |  1 favorite  |  99 downloads  |  4 embeds (Stats)
 

Categories

Add Category
 
 
 
 

Groups / Events

 

 
Embed
options

More Info

This slideshow is Public
Total Views: 2763
on Slideshare: 2563
from embeds: 200

Slideshow transcript

Slide 1: Introduzione a Spring JUG Genova Meeting 18/09/2007 Corrado Alesso – Carlo Bonamico

Slide 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

Slide 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 :-)

Slide 4: Overview

Slide 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 −

Slide 6: Inversion of Control (IoC) The “Hollywood Principle” Lo dicevano i produttori di Hollywood agli Don't call me, I'll call you aspiranti attori :-) 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

Slide 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?

Slide 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

Slide 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

Slide 10: Esempio Eclipse...

Slide 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

Slide 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

Slide 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>

Slide 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)

Slide 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 −

Slide 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

Slide 17: Esempio Eclipse...

Slide 18: Gli altri moduli di Spring DAO ORM AOP (vedi presentazione di Fabio) J2EE Web (MVC)

Slide 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

Slide 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

Slide 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(); } }

Slide 22: ORM – Hibernate con Spring public List findCityByCountry (String country) { return getHibernateTemplate().find( “from City where country = :country”, “country”, country); }

Slide 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 

Slide 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);

Slide 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()

Slide 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)

Slide 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/

Slide 28: Q&A GRAZIE per l'attenzione!