Il framework Spring
Relatore:
Ch.mo prof. Marcello Cinque
Candidato:
Pasquale Tremante
matr. N46001295
Indice
1 Introduzione 2
2 Cenni introduttivi 3
2.1 Introduzione a Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
3 Spring Framework 4
3.1 Descrizione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
3.3 Moduli . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
3.3.3 Web . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
3.3.5 Test . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
6 Conclusioni 26
7 Bibliograa 27
1
1 Introduzione
Negli ultimi anni il continuo evolversi delle tecnologie per lo sviluppo di software, ha portato privati
interfaccia graca per gestire al meglio i propri dati. Questo richiede al programmatore la capacit
di doversi adattare alle diverse problematiche che si incontrano durante lo sviluppo di applicazioni;
da qui nasce l'esigenza di lavorare su piattaforme che agevolino il compito del programmatore.
In un primo momento, venne molto apprezzata la tecnologia JavaBeans, ancora in uso, che preve-
deva l`utilizzo di semplici classi java (beans) con regole determinate di nomenclatura per la loro
introspezione (propriet accessibili mediante metodi pressati da get e set); tuttavia anche questa
col tempo ha cominciato a mostrare i suoi limiti (di cui discuteremo nell'elaborato), motivo per
Ed qui che entra in scena Spring, un framework nato per supportare i programmatori nello svi-
Nel seguente elaborato viene riportata una panoramica di questo framework mostrandone la strut-
tura, i punti di forza e qualche esempio che mostra come realizzare un'applicazione sia standalone
che Web.
2
2 Cenni introduttivi
2.1 Introduzione a Java
Java un linguaggio di programmazione orientato agli oggetti progettato per essere indipendente
dalla piattaforma sica di esecuzione; tale progetto venne iniziato da James Gosling ed altri inge-
I programmi scritti con questo linguaggio vengono compilati ed eseguiti su una piattaforma soft-
Il codice sorgente Java viene dapprima compilato con un compilatore java ( javac), il quale genera
il codice compilato (detto bytecode) che verr poi passato alla JVM, la quale dispone di un
interprete che le consente di tradurre il bytecode in linguaggio macchina per poi eseguirlo.
Java si divide essenzialmente in tre piattaforme dierenti, utili a seconda dell'uso e del tipo di
progetto da sviluppare:
ed i componenti nel server, che saranno poi utilizzati dallo sviluppatore Java Client: alcuni
ticolare design pattern) su cui un software pu essere progettato e realizzato, spesso facilitandone
La sua funzione quella di creare una infrastruttura generale, lasciando al programmatore il con-
Esso denito da un insieme di classi astratte e dalle relazioni tra esse. Istanziare un framework
Nella pratica un framework viene messo a disposizione sotto forma di archivio contenente le clas-
si software che lo sviluppatore pu utilizzare e gestire. Ovviamente questo non coincide con il
semplice mettere a disposizione delle librerie di classi in quanto quando si utilizza un framework
bisogna attenersi alle speciche denite dal framework stesso e lasciargli il usso di controllo.
I framework possono essere creati per diversi obiettivi: gestione della persistenza, realizzazione di
3
3 Spring Framework
3.1 Descrizione
Spring un framework open source per lo sviluppo di applicazioni Java, in particolare per appli-
cazioni J2EE.
La prima versione del framework fu rilasciata nel 2002 da Rod Johnson, subendo poi molti cam-
biamenti che hanno portato questo framework ad essere molto apprezzato dalla comunit interna-
zionale ed a vincere nel 2006 un Jolt productivity award e un JAX Innovation Award.
Spring molto apprezzato nella comunit Java grazie degli innumerevoli vantaggi che esso ore,
come la modulart, l'integrabilit, la portabilit...di cui tratteremo a breve; per di pi tale fra-
mework rappresenta anche una valida alternativa a Enterprise JavaBean(EJB), in quanto lascia
una maggiore libert al programmatore mettendo a disposizione un'ampia gamma di soluzioni ben
Tuttavia, nonostante Spring metta a disposizione strumenti per realizzare qualsiasi tipo di applica-
zioni Java, il settore in cui pi viene utilizzato quello delle applicazioni web-based (in particolare
quelle che si basano sul modello MVC) costruite sul modello della piattaforma Java EE.
Questo ha permesso a Spring di essere riconosciuto anche da importanti vendor commerciali quale
1. Modulare: Pur essendo molto ampio, grazie alla sua modularit si pu scegliere di integrare
solo alcuni dei suoi moduli all'interno del nostro progetto. Per questo Spring facilmente
all'interno della nostra business logic praticamente nulle, e ove presenti facilmente isolabili.
Per instaziare einizializzare oggetti nel framework non si devono implementare interfacce
3. Integrabile: In Spring non ci sono package di logging, connection pool o O/R mapping,
poich tutte queste funzionalit sono fornite da altri framework open source. Spring non ha
applicazione J2EE usanso solo POJO, dotandoli di funzionalit enterprise in modo non
invasivo.
6. Test driven enabled: Spring ci permette di scrivere software facile da testare, quindi risulta
un framework ideale per i software che sono scritti basandosi sul Test Driven Development.
4
Inoltre ore anche i seguenti vantaggi:
Elimina la proliferazione di custom properties le. Per capire quali sono le dipendenze di una
classe, basta solo guardarne il costruttore o le sue property. Questo possibile grazie all'uso
Ci aiutia a risolvere i problemi comuni delle applicazioni enterprise, rendendo opzionale l'uso
degli EJB. In questo modo possiamo scegliere di implemenrare le interfacce di business nei
Ore un consistente framework per il Data Access, sia usando JDBC, sia usando altri prodotti
3.3 Moduli
Come accennato nel precedente paragrafo, Spring un framework modulare. Le sue funzionalit
sono distribuite all'interno di circa 20 moduli, alcuni dei quali sono raggruppati all'interno di
Esso consente il disaccoppiamento tra denizione e congurazione delle dipendenze e della logica
applicativa.
Il modulo Context costituisce il mezzo di accesso agli oggetti attraverso la sua interfaccia Applica-
tionContext. L'ApplicationContext eredita tutti le funzionalit della BeanFactory, aggiungendone
5
Il modulo Expression Language fornisce una potente espressione di linguaggio per la ricerca
e la manipolazione degli oggetti a runtime. Tale linguaggio supporta le operazioni di modica e re-
tra pi liste.
di questi framework con le peculiarit oerte da Spring, come la gestione delle transazioni.
Il modulo OXM fornisce un livello di astrazione che supporta le implementazione del mapping
3.3.3 Web
Il modulo Web contiene le funzionalit di base per creare applicationi enterprise, come ad esempio
il supporto per l'upload dei le, orendo anche l'inizializzazione del container IoC attraverso un
Servlet Listener.
le applicazioni web. Il framework MVC di Spring provvede a una netta separazione del dominio
del codice del Model da quello della View ; per di pi si integra con tutte le altre caratteristiche di
Spring Framework.
Il modulo Struts contiene classi per l'integrazione con Struts2, che per sconsiglita nella versione
3 di Spring.
grammazione aspect-oriented. Questo layer consente di creare codice che deve essere disaccoppiato
Questo layer ha anche un modulo Aspects per l'integrazione con AspectJ, ed un modulo Instru-
3.3.5 Test
Il modulo Test ore la possibilt di testare i componenti di Spring, usando JUnit o TestNG.
6
3.4 Inversion of Control e Dependency Injection
Nella programmazione orientata agli oggetti uno degli obiettivi principali che ci si impone quello
di realizzare applicazioni che siano quanto pi possibili modulari e fare sicch tra i vari moduli che
costituiscono un'applicazione vi sia un basso grado di accoppiamento (cio siano quanto pi possi-
bile indipendenti gli uni dagli altri); in tal modo infatti si garantisce la riusabilit e la testabilit
Tuttavia quando si realizzano applicazioni molto complesse, inevitabile che si instaurino delle
dipendenze tra vari i vari oggetti (si pensi all'ereditariet e alla composizione tra le classi).
Il framework Spring perci propone una strategia per eliminare queste dipendenze tra classi, ovvero
l'Inversione del Controllo, e questa funzionalit rappresenta un' altro dei suoi punti forti.
L'Inversione del Controllo (in inglese Inversion of Control, abbreviato in IoC) un pattern
un libreria riusabile; in parole povere, sposta la denizione delle dipendenze tra gli oggetti, dal
codice (scritto dallo sviluppatore) al framework. Spring realizza l'IoC tramite la tecnica della De-
pendency Injection che di base consiste nell'avere un oggetto separato(un le .xml) che si occupi
della risoluzione delle dipendenze e della loro inizializzazione.
lare servizio, l'oggetto stesso si prende la responsabilit di gestirlo, o avendo un diretto riferimento
al servizio, o individuandolo con un Service Locator che gli restituisce un riferimento ad una spe-
cica implementazione del servizio. Con l'utilizzo della dependency injection, l'oggetto ha in s
solamente una propriet che pu ospitare un riferimento a quel servizio e, quando l'oggetto viene
istanziato, un riferimento ad una implementazione di questo servizio gli viene iniettata dal fra-
mework esterno, senza che il programmatore che crea l'oggetto sappia nulla sul posizionamento del
Agenda.java
1 package agenda ;
2
3 import java . util . ArrayList ;
4 import utente . Utente ;
5
6 public class Agenda implements IAgenda
7 {
8 private ArrayList < Utente > users ;
9
10 public Agenda ()
11 { users = new ArrayList < >();}
12
13 public void printAll ()
14 {
15 for ( int i =0; i < users . size (); i ++)
16 users . get (i ). print ();
17 }
18
19 public ArrayList < Utente > getAgenda ()
20 { return users ;}
7
21
22 public void setAgenda ( ArrayList < Utente > agenda )
23 { this . users = agenda ;}
24
25 public void addUser ( String nome , String cognome , int eta )
26 { users . add ( new Utente ( nome , cognome , eta ));}
27 }
Inne la classe di servizio Gestore istanzia al suo interno un vettore di Utenti e ne invoca il servizio
esposto
Gestore.java
Utilizzando invece la tecnica del Dependency Injection la dipendenza dall'oggetto Agenda viene
risolta all'interno del framework Spring, evitando di risolvere la stessa nel costruttore della classe
Gestore.
1. Constructor Injection;
2. Setter Injection;
3. Interface Injection.
8
3.5 Spring Beans
In questa sezione vedremo come congurare un IoC Container attraverso i metadati xml.
1 < bean id =" utente1 " class =" com . Utente " >
2 </ bean >
E' possibile poi includere un terzo parametro cio la visibilit del bean(scope) che ne stabilisce il
globalsession : viene creata una sola istanza per l'intera sessione HTTP;
ad esempio:
1 < bean id =" utente1 " class =" com . Utente " scope =" singleton " >
2 </ bean >
Attraverso il costruttore;
Se non specicato un metodo, Spring di default utilizza un costruttore per istanziare i bean,
Vediamo ora come realizzare l'IoC attraverso la Setter Dependency Injection e la Constructor
Setter Dependency.
bean che vuole utilizzare un certo servizio di un'altro bean. Per chiarire riportiamo un esempio.
9
6 public BeanA ( String beanName , BeanB beanB )
7 {
8 this . beanName = beanName ;
9 this . beanB = beanB ;
10 }
11
12 // ... business logic
13
14 }
La classe BeanA ha una dipendenza da quella BeanB. Vediamo come congurarla nel le .xml:
Quindi per congurare la dipendenza tramite costruttore si utilizza il tag constructor-arg insieme
agli attributi:
ref per passare come argomento un altro bean gia istanziato nell'IoC Container.
L'attributo index serve per specicare l'ordine con cui passare i parametri al costruttore. Non
necessario quando i tipi degli argomenti da passare sono tutti diversi tra loro.
oggetti(A dipende da B e viceversa), compito che invece puo essere svolto dalla Setter Dependency
Injection.
Tale tecnica permette di iniettare le dipendenze dopo che l'oggetto stato istanziato; solo neces-
sario denire i metodi Getter e Setter all'interno della classe che ha la dipendenza.
Cio riprendendo l'esempio del paragrafo precedente(BeanA che dipende da BeanB) avremo:
10
15 public BeanB getBeanB ()
16 { return this . beanB ;}
17
18 // ... business logic
19
20 }
E' anche possibile iniettare degli oggetti con dei valori statici e rappresentazione in string.
1 < bean id =" utente1 " class =" com . Utente " >
2 < property name =" nome " value =" Pasquale " / >
3 < property name =" cognome " value =" Tremante "/ >
4 < property name =" eta " value =25/ >
5 </ bean >
11
3.5.3 Richiamo dei beans
Supponiamo di aver istanziato un beanA e un beanB all'interno di un le 'beans.xml', vediamo ora
come richiamarli all'interno di un programma principale:
12
3.6 Utilizzo delle Annotations
Finora abbiamo visto come congurare le dipendenze tra i bean attraverso metadati in formato
Vediamo come...
In tal caso @Autowired stata utilizzata sul costruttore della classe, quindi il le di congurazione
Da notare che di default la congurazione attraverso le Java Annotation non abilitata, per abi-
13
18 public void setBeanB ( BeanB beanB )
19 { this . beanB = beanB ;}
20
21 // business logic ..........
22 }
Un'altra annotation utile @Qualier che serve per specicare l'id del bean che si vuole iniettare,
nel caso ce ne siano due della stessa classe. Ad esempio:
oppure:
14
3.7 Sviluppo di un applicazione con Spring
Sviluppiamo ora un'applicazione in Spring che riassuma e mostri le funzionalit discusse no ad
ora.
IUtente.java
Utente.java
15
Riportiamo l'implementazione dell'interfaccia e della classe Agenda:
IAgenda.java
Agenda.java
16
Riportiamo l'implementazione della classe Gestore:
Gestore.java
Da notare che nel costruttore della classe Gestore non stata risolta la dipendenza con la classe
Agenda; questa verr risolta nel le di congurazione 'Beans.xml' tramite la Setter Dependency
Injection(infatti abbiamo aggiunto alla classe Gestore anche i metodi setAgenda e getAgenda).
17
Beans.xml
Riportiamo inne il programma principale(denito come metodo della classe Gestore) per vedere
Gestore.java
18
4 Integrazione di Enterprise JavaBeans
Spring viene spesso considerato una valida alternativa a Enterprise JavaBeans,questo perch quasi
la maggior parte delle applicazioni realizzate combinando le funzionalit di Spring con quelle di
accesso ORM e JBDC, si sono rivelate una scelta migliore rispetto a quelle realizzate con i container
Tuttavia importante precisare che l'utilizzo di Spring non previene l'utilizzo degli EJBs, bens ne
Per di pi, usando Spring, l'accesso ai servizi forniti dagli EJBs permette l'implementazione di
quei servizi che rendono trasparente il passaggio da EJB locali a remoti, senza che il codice Client
Ricordiamo che, utilizzando EJB, per invocare un metodo su un session bean stateless(locale o
remoto), il codice cliente deve innanzitutto eettuare un'operazione di JNDI lookup per ottenere
un oggetto EJB-Home tramite il quale otterr l'oggetto vero e proprio,cio EJB-Object, sul quale
Quindi per ridurre la quantit di codice, molte applicazioni EJB utilizzano i pattern Service
Locator e Business Delegate, i quali costituiscono un'alternativa migliore alle operazioni di JNDI
Solitamente il codice che utilizza gli EJBs dipende dai Service Locator e Business Delegate
Nel caso venga utilizzato il pattern Service Locator senza quello Business Delegate, il
codice dell'applicazione nisce con il dover richiamare il metodo create() su un EJB home, e
cui bisogna scrivere numerosi metodi che semplicemente richiamano gli stessi metodi dell'
EJB.
all'interno di un container Spring, i quali operano come delegati del codice; quindi non necessario
scrivere un altro Service Locator, eettuare un altro JNDI lookup o duplicare metodi nel Business
Delegate.
19
5 Spring MVC
Spring MVC la parte del framework che fornisce le funzionalit per la realizzazione di applicazioni
punti di forza di Spring come l'inversion of control (tramite dependency injection) e la aspect
oriented programming.
Spring MVC implementa perfettamente il pattern mantenendone sia i concetti che la nomenclatura.
i Model che sono rappresentati dalle classi che a loro volta rappresentano gli oggetti gestiti
e le classi di accesso al database;
le View che sono rappresentate dai vari le JSP (compilati in HTML) e da eventuali classi
per l'esportazione in formati diversi da HTML (PDF, XLS, CSV. . . );
la richiesta dell'utente.
DispatcherServlet
View Resolver
Handlers
La DispatcherServlet una servlet(oggetto scritto in linguaggio Java che opera all'interno di
un server web) che si occupa di smistare tutte le richieste (POST,GET,PUT ...) ai vari handlers,
La DispatcherServlet, essendo una servlet, deve essere mappata nel le web.xml nel seguente modo:
web.xml
do tutti i beans dichiarati nel le WEB-INF/dispatcher-servlet.xml. In particolare tra questi beans
Gli handlers (detti anche controller) sono i beans che si occupano di servire realmente le richieste
fornite dalla DispatcherServlet, e sono quindi quelli che implementano la business logic dell'appli-
cazione.
20
controller.java
1 @Controller
2 public class MyController {
3 @RequestMapping ( value = "/" , method = RequestMethod . GET )
4 public String paginaPersonale ( Model model ) {
5 model . addAttribute (" nome " , " Pasquale " );
6 model . addAttribute (" cognome " , " Tremante " );
7 return " pagina - personale ";
8 }
9 }
I controller devono poi essere deniti nel le WEB-INF/dispatcher-servlet.xml ; per farlo deniamo
all'interno del le uno scanner che si occupa di trovare le classi annotate con l' annotation di Spring
e Spring MVC.
dispatcher-servlet.xml
Attraverso questa congurazione di esempio viene detto a Spring che il mapping dei controllers av-
viene attraverso le annotation, quindi, quando viene fatta una richiesta del tipo http://..../example/
la DispatcherServlet reindirizza la chiamata al nostro controller di esempio, che eettua delle ope-
razioni sul model e poi restituisce una stringa che rappresenta il view resolver.
dispatcher-servlet.xml
1 < bean id =" viewResolver " class =" org . springframework . web . servlet . view .
2 InternalResourceViewResolver " >
3 < property name =" viewClass " value =" org . springframework . web . servlet . view . JstlView "/ >
4 < property name =" prefix " value ="/ WEB - INF / jsp /"/ >
5 < property name =" suffix " value =". jsp "/ >
6 </ bean >
21
Riportiamo uno schema riassuntivo del funzionamento delle tre componenti appena illustrate:
Riportiamo ora un semplice esempio che mostri come realizzare una semplice applicazione Hello-
Il primo passo quello di creare il le web.xml all'interno del quale va congurato il WebApplica-
web.xml
22
25 <init - param >
26 < param - name > contextConfigLocation </ param - name >
27 < param - value >
28 / WEB - INF / spring / appServlet / servlet - context . xml
29 </ param - value >
30 </ init - param >
31 <load -on - startup >1 </ load -on - startup >
32 </ servlet >
33
34 < servlet - mapping >
35 < servlet - name > appServlet </ servlet - name >
36 <url - pattern >/ </ url - pattern >
37 </ servlet - mapping >
38 </ web - app >
HomeController.java
Implementiamo poi la pagina jsp che avr il compito di mostrare i dati contenuti nel model.
Ricordiamo che jsp(Java Server Page) un linguaggio che permette di scrivere pagine che hanno
sia codice HTML sia codice Java che verr eseguito dal Server su cui si trover la pagina.
23
home.jsp
1 <%@ taglib uri =" http :// java . sun . com / jsp / jstl / core " prefix ="c" %>
2 <%@ page session =" false " %>
3 <html >
4 <head >
5 < title > Home </ title >
6 </ head >
7 <body >
8 <h1 >
9 Hello world !
10 </h1 >
11
12 <P > Io sono ${ nome } ${ cognome } e il mio numero di matricola : $ { matricola } </P >
13 </ body >
14 </ html >
servlet-context.xml
24
Il risultato ottenuto sar il seguente:
Per lo sviluppo dell'applicazione abbiamo utilizzato SpringToolSuite, una variante di Eclipse rea-
lizzata appositamante per utilizzare le funzionalit di Spring e scaricabile direttamente dal sito
uciale di Spring.
L'applicazione fornisce svariate agevolazioni tra cui quella di generare automaticamente i le di
25
6 Conclusioni
Si conclude qui il nostro tour su Spring. In realt ci sarebbero ancora tantissimi altri aspetti im-
portanti da trattare, altrettante funzionalit da mostrare e ovviamente anche gli esempi mostrati
non riescono ad evidenziare al meglio tutti i vantaggi che il framework ore, anche perch i beneci
veri e propri cominciano a farsi sentire nella realizzazione di applicazioni su larga scala. Tuttavia,
nonostante il percorso sia stato molto breve, esso stato comunque intenso. Abbiamo infatti visto
come grazie all'Inversion of Control e alla Dependency Injection si possano implementare classi di
oggetti, minimizzando le dipendenze che vi sono semplicemente scrivendo poche righe di xml. Ab-
biamo poi visto come Spring si sia rivelato un'ottima alternativa a Enterprise JavaBean, non solo
perch lo integra al proprio interno ma anche perch ne rende pi semplice e funzionale l'utilizzo.
Inne abbiamo visto come Spring implementi in modo facile ed eciente il pattern MVC mante-
nendo i vantaggi illustrati prima, capendo quindi come mai il framework sia molto apprezzato da
sviluppo di applicazioni enterprise di una certa complessit nell`ambito Java. Esso interpreta
ottimamente i concetti dell`IoC e dall`AOP che gli permettono di raggiungere un livello di disac-
coppiamento tra le componenti software che non era mai stato raggiunto della tecnologia EJB. In
pi ore una vasta gamma di soluzioni per coprire i problemi pi comuni che si incontrano nello
26
7 Bibliograa
1. Spring Framework: Reference Documentation,
http://docs.spring.io/spring-framework/docs/3.0.x/reference/index.html
4. Wikipedia: Framework
https://it.wikipedia.org/wiki/Framework
27