Cos'è Spring framework e perché conviene conoscerlo

Chi bazzica da un po’ il mondo Java e in particolare si occupa di sviluppo web su piattaforma JVM dovrebbe aver sentito parlare di Spring e Spring Boot.

Due progetti apparentemente simili, ma in realtà complementari. Il primo con una lunga storia alle spalle ed un’eredità ormai piuttosto pesante… Il secondo, nato dieci anni dopo il fratello maggiore, con lo scopo di ridare un po’ di freschezza e slancio al progetto originario.

Per chi non sapesse di cosa si parla, in questo post faccio una breve panoramica sui due progetti e sulle loro peculiarità.

Partiamo quindi con un po’ di presentazioni.

NOTA Questo post riporta un estratto del mio ebook “Creare applicazioni web con Spring Boot”.

Due parole su Spring

Riprendendo liberamente la definizione data da Wikipedia, Spring è un framework open source per lo sviluppo di applicazioni su piattaforma Java.

Il framework nasce nel 2002, ad opera di Rod Johnson, con l’obiettivo di proporre un’alternativa “leggera” e flessibile allo standard EJB (Enterprise JavaBeans) per la realizzazione di applicazione di livello enterprise.

Il cuore del framework è costituito da un Inversion of Control container che si occupa di gestire l’intero ciclo di vita degli oggetti presenti nel contesto applicativo, dalla configurazione, al reperimento delle dipendenze e creazione delle singole istanze — il tutto, tramite Dependency Injection.

Nel corso degli anni, il progetto core è stato affiancato da altri progetti satellite che vanno ad aggiungere utilità e funzionalità al framework, anche in termini d’integrazione con sistemi esterni all’applicazione. Basti pensare ai progetti Spring Security, Spring Data, Spring Cloud, ecc.

Spring è certamente uno strumento di lavoro maturo e stabile, uno tra i “pionieri” nel panorama dei framework. Tra i primi — se non il primo — a sdoganare i concetti di Inversion of Control e Aspect Oriented Programming.

Tre motivi — scelti dal mazzo — per scegliere questo framework:

  • Flessibilità e modularità. Spring lascia ampia libertà allo sviluppatore riguardo al percorso da seguire per arrivare al risultato desiderato. I vincoli da rispettare sono veramente pochi. Spring ci consegna i “mattoncini”, sta a noi incastrarli nel modo che riteniamo più opportuno.

  • Elevata testabilità. Aspetto spesso sottovalutato. Grazie alla Dependency Injection, paradigma che permette di eliminare dal nostro codice dipendenze dirette tra le classi, possiamo ottenere un’elevata testabilità dei singoli componenti dell’applicazione.

  • Community numerosa. Gli appassionati e i professionisti che ruotano attorno a questo mondo sono tantissimi, ognuno pronto a dare il suo contributo in termini di nuove funzionalità, testing e bug-fixing. Anche la comunità dei blogger è molto attiva e fornisce un supporto importante con numerose guide e tutorial.

Come già accennato, negli anni Spring è cresciuto notevolmente rispetto al nucleo iniziale e questo, se da un lato ha portato dei vantaggi, ha sicuramente accentuato anche una serie di aspetti negativi. Ne elenco nuovamente tre, per par condicio:

  • Documentazione molto estesa e a volte dispersiva. Se per alcuni strumenti il problema è costituito da una documentazione frammentaria o addirittura assente, questo non è sicuramente il caso di Spring. Tutt’altro: a volte risulta faticoso districarsi nel mare d’informazioni disponibili; e può capitare di perdersi prima di trovare la risposta ad i nostri dubbi.

  • Eccessiva flessibilità. Un punto di forza può trasformarsi anche in un risvolto negativo. La possibilità d’implementare soluzioni in maniera differente, a volte disorienta. In più di una situazione potremmo avere l’impressione di non aver utilizzato qualcosa nel modo giusto. Seguire guide o tutorial serve a poco, poiché — ovviamente — ognuno ha la sua versione su come approcciare il problema e questo rischia di creare ancora più confusione. Per quanto riguarda la documentazione… be’ ne abbiamo già parlato.

  • Configurazione complessa. Ed ora veniamo al vero tallone d’Achille di Spring, ovvero la sua configurazione. Benché esistano differenti modi di configurare gli elementi del framework (XML-based, Annotation-based, JavaConfig-based) — ognuno con i suoi pro e i suoi contro — lo sviluppatore inesperto finirà per avvertire un certo senso di frustrazione di fronte alla mole di linee di codice necessarie a predisporre anche il più semplice dei progetti.

Con il crescere del progetto — che nel frattempo si è trasformato in un vero e proprio ecosistema —, padroneggiare i molteplici aspetti del framework è diventato, ovviamente, sempre meno facile. Tanto da spingere il team di Spring a pensare ad un approccio nuovo che riducesse la curva di apprendimento e facilitasse l’adozione del framework.

Il tutto si è concretizzato nel progetto Spring Boot.

Due parole su Spring Boot

La prima milestone release del progetto Spring Boot risale al 2013. Il rilascio della versione 1.0 GA risale invece all’aprile del 2014.

Dopo più di dieci anni dalla nascita di Spring, era emersa la necessità — e la possibilità — di semplificare alcuni aspetti del framework, soprattutto per quanto riguarda la fase di bootstrap di nuovi progetti.

Spring Boot non è un nuovo framework per la creazione di applicazioni, bensì una sorta di “sovrastruttura” che permette di sfruttare al massimo gli strumenti forniti da Spring con il minimo dello sforzo — o quasi — da parte dello sviluppatore.

In particolare, le difficoltà nel configurare un nuovo progetto, tipiche del “vecchio” framework vengono mitigate — se non del tutto eliminate — grazie ad una serie di configurazioni di default basate su un approccio “opinionated”.

Spring Boot si prende la briga di configurare automaticamente tutto ciò che tipicamente viene utilizzato in un’applicazione basata su Spring, mentre per qualunque personalizzazione che esca dallo standard, lo sviluppatore può implementare logiche custom sfruttando il paradigma convention over configuration.

Inoltre le applicazioni basate su Spring Boot sono, a tutti gli effetti, applicazioni standalone, eseguibili tramite il classico metodo main. La build genera un pacchetto eseguibile, che include una versione embedded del web container (di default, Tomcat). Questo ci toglie l’incombenza di dover installare e configurare un web server — con tutte le problematiche del caso — sia sulla macchina di sviluppo che su quella di produzione.

Insomma, un notevole passo avanti!

In conclusione

In questo post vi ho raccontato un po’ di cose su Spring e Spring Boot, così da incuriosire chi non conoscesse già questi due strumenti.

Spring fornisce una serie di formidabili strumenti allo sviluppatore che voglia creare applicazioni — non solamente web based — solide e manutenibili. D’altro canto, però, da grandi poteri derivano grandi… complessità!

Fortunatamente Spring Boot ci viene in aiuto, semplificando e velocizzando l’intero processo di sviluppo di applicazioni basate sul framework Spring.

Se vi va, nei commenti raccontatemi la vostra esperienza con questi framework. Cosa vi piace e cosa proprio non sopportate dei due! 😉

A presto,

David