Corso di Java Spring Framework #1 | Una panoramica
Spring è un framework applicativo open source che nasce per lo sviluppo di applicazioni enterprise, ovvero applicazioni complesse destinate ad aziende del settore bancario, finanziario, della pubblica amministrazione ecc. e che presentano particolari requisiti di
- sicurezza
- affidabilità
- scalabilità
oltre alla necessità di gestire enormi quantità di dati.
Di conseguenza tali applicazioni devono avere delle caratteristiche adeguate.
Facciamo un piccolo excursus storico per capire come nasce Spring, quando si sviluppa e a quali esigenze cerca di rispondere.
Dobbiamo tornare indietro di circa vent'anni, nell'ottobre 2002, quando il framework Java di riferimento era rappresentato da Java Enterprise Edition.
Tale framework ha cambiato nome più volte nel corso della sua storia: inizialmente si chiamava J2EE, poi Java Enterprise Edition, JavaEE e infine Jakarta.
All'epoca rappresentava in un certo senso lo stato dell'arte ma non brillava per leggerezza, ovvero era un framework particolarmente oneroso dal punto di vista delle risorse perché basato pesantemente sui cosiddetti EJB (Enterprise Java Beans), ovvero dei componenti che venivano utilizzati appositamente per realizzare queste genere di applicazioni.
Questo fu uno dei motivi che portò Java ad essere considerato un linguaggio "elefantiaco", una nomea che si è portato dietro per diversi anni.
L'idea di realizzare un framework un po' più leggero venne ad uno sviluppatore, Rod Johnson, il quale pubblicò un libro nel 2002 in cui mostrava proprio i limiti del framework Java Enterprise Edition ed in particolar modo della forte dipendenza dagli EJB.
La sua idea era di sviluppare una soluzione basata sulle cosiddette classi Pojo, ovvero classi Java molto più leggere degli EJB, e con l'adozione della dependency injection per gestire le dipendenze. In più propose l'utilizzo di un'ampia serie di interfacce e di classi riusabili.
L'obiettivo principale della sua proposta era di non legare le applicazioni a specifici componenti difficilmente riutilizzabili in contesti differenti a differenza delle già citate classi Pojo.
All'interno del libro Johnson mostra un progetto open source in cui realizza un'applicazione enterprise in maniera molto semplice e soprattutto senza ricorrere agli EJB.
Quello che sembrava semplicemente un esercizio di stile o comunque un progetto a scopo didattico attira l'interesse di una vasta comunità di sviluppatori che spingono Johnson a creare un vero e proprio progetto concreto, riprendendo ed ampliando il codice già presente all'interno del libro come semplice risorsa didattica.
Nasce il progetto o meglio il nuovo framework che viene battezzato "Spring", termine che in inglese significa "primavera".
La scelta del nome è emblematica in quanto questo framework in qualche modo vuole rappresentare una sorta di rinascita delle applicazioni Java enterprise rispetto al passato, in modo tale da realizzare delle soluzioni dotate di tutte quelle caratteristiche illustrate in precedenza, ma allo stesso tempo più leggere e meno avide di risorse.
Il framework deve quindi garantire una maggiore semplicità di utilizzo senza rinunciare alla potenza.
Nel giugno 2003 viene rilasciata la prima versione con licenza Apache v2 e da allora Spring è sul mercato e si è affermato nel mondo delle applicazioni Java, proseguendo un continuo sviluppo negli ultimi 20 anni.
In effetti Spring è un vero e proprio ecosistema perché una delle sue caratteristiche fondamentali è la modularità: quando si realizza un'applicazione possiamo scegliere i componenti necessari per soddisfare i requisiti di progetto.
In sostanza Spring mette a disposizione una serie di moduli o micro framework con cui possiamo comporre le nostra applicazione come se si trattasse di un puzzle.
Le funzionalità principali sono incluse nel Core mentre le altre sono implementate da specifici progetti che sono elencati sul sito ufficiale: applicazioni web, gestione della persistenza, sicurezza, cloud ecc.
Per ogni problema da risolvere ci sarà sicuramente un micro framework da introdurre nella nostra applicazione.
Proviamo a fare una panoramica delle principali caratteristiche di Spring rimandando gli approfondimenti alla documentazione ufficiale.
L'obiettivo del team che si occupa del framework è la semplificazione del lavoro degli sviluppatori che lo utilizzano.
Spesso si sente dire che Spring è un framework "opinionated", ovvero un framework in cui sono state fatte delle scelte e prese delle decisioni da parte del core team che influiscono sulle impostazioni e configurazioni dello stesso.
Non si tratta di scelte casuali ma del frutto di uno studio finalizzato a comprendere le principali esigenze degli sviluppatori nell'ambito delle applicazioni.
Di conseguenza le soluzioni proposte funzionano nella maggior parte dei casi, fermo restando la possibilità di ulteriori personalizzazioni.
In primo luogo l'indipendenza dagli EJB si ottiene utilizzando le classi Pojo, costituite da attributi privati accessibili mediante metodi getter e setter a cui si aggiungono i classici costruttori.
Tali classi non implementano interfacce nè estendono altre classi specifiche del framework, per cui possono essere estratte da un progetto e riutilizzate in altri contesti, garantendo il massimo livello di riusabilità.
Un altro concetto molto importante riguarda la riduzione dell'accoppiamento tra i vari componenti che in Spring è ottenuto attraverso l'Inversion of Control e più precisamente attraverso una delle sue possibili implementazioni: la Dependency Injection.
L'idea di fondo è che un componente che ha bisogno di un altro componente deve poterlo utilizzare ma non deve essere strettamente accoppiato allo stesso, così da poter essere riutilizzato in un contesto differente.
Un componente fortemente accoppiato ad un altro deve portarselo dietro in qualsiasi altro ambito con tutte le complicazioni del caso.
Molto spesso si fa uso di astrazioni ovvero di interfacce per non essere vincolati ad una particolare implementazione e questo permette di estendere i vari modelli e di adattare le varie soluzioni al particolare contesto operativo.
Allo stesso tempo si fa un uso intenso delle annotazioni, tipiche dell'approccio dichiarativo in cui si specifica ciò che si vuole ottenere in contrasto con l'approccio imperativo.
In pratica anziché andare a scrivere nel dettaglio quello che vogliamo che il programma faccia, dichiariamo attraverso le annotazioni ciò che vogliamo ottenere.
Ad esempio nell'ambito della dependency injection abbiamo un componente in una classe che ha bisogno di un'istanza di un'altra classe.
Utilizzando l'annotazione @Autowired
possiamo "iniettare" il componente all'interno della classe che ne ha bisogno.
In pratica non stiamo dicendo a Spring come deve fare il proprio lavoro ma semplicemente cosa vogliamo ottenere, lasciando al framework tutti i dettagli operativi.
Esistono tante annotazioni diverse e specifiche di ogni modulo.
In più è possibile utilizzare dei template con cui si elimina il "boilerplate code" ovvero il codice ripetitivo presente in tutti i progetti e che possiamo rifinire e adattare nell'ambito dell'applicazione a cui stiamo lavorando.
Da citare anche la possibilità di integrarsi con tantissimi altri framework e di cui parleremo nei prossimi articoli.
Per concludere possiamo dire che Spring è un framework molto diffuso, che negli anni si è evoluto tantissimo superando molti dei limiti presenti nelle primissime versioni.
Contestualmente anche Java Enterprise Edition ha subito vari cambiamenti e miglioramenti e ha messo in campo diverse soluzioni sviluppate originariamente proprio da Spring.
Citiamo anche Spring Boot che ha permesso di semplificare notevolmente lo sviluppo delle applicazioni Spring e di cui parleremo in dettaglio in un prossimo articolo.