Introduction To Spring Citro 2023
Introduction To Spring Citro 2023
Tiziano Citro
1 Spring
Outline
Spring Boot
Spring Stereotype
Spring Data
1 Spring Session
Outline
Spring Security
Spring Cloud
Thymeleaf
Spring
Spring è considerato il più popolare tra i framework per lo sviluppo di applicazioni Java Enterprise.
Fornisce tutto il necessario per utilizzare il linguaggio Java in un ambiente enterprise offrendo
soluzioni ai problemi comuni allo sviluppo di questa tipologia di applicazioni.
Essendo il framework Java più popolare al mondo vanta una grande e attiva community che fornisce
feedback sulla base di casi d’uso reali.
4
SPRING
Architettura
Il modulo Core fornisce le funzionalità fondamentali,
come: Inversion of Control, Dependency injection,
application context (come un registro JNDI), ecc.
Struttura modulare
Il framework è progettato con una struttura modulare.
Il modulo core è sempre necessario mentre gli altri moduli possono essere introdotti se necessari
all’applicazione.
6
SPRING
Basato sul concetto di un Project Object Model (POM), Maven può gestire la build e documentazione di un
progetto in maniera centralizzata.
Un POM è l'unità fondamentale di lavoro in Maven. È un file XML chiamato pom.xml che contiene
informazioni sul progetto e dettagli di configurazione utilizzati da Maven per il processo di build.
7
SPRING
8
SPRING BOOT
Spring Boot
Configurare un’applicazione Spring non è banale, oltre alle dipendenze è necessario configurare
manualmente molte delle funzionalità, ad esempio tramite XML.
Spring Boot semplifica la creazione di applicazioni Spring-based, richiedendo una configurazione minima.
● Riduzione del tempo necessario per la configurazione, ad esempio eliminando le configurazioni XML;
● Una soluzione opinionata ma che possa essere facilmente estesa e personalizzata;
● Funzionalità comuni a tutte le app, come sicurezza, health-check, configurazione esternalizzata, ecc.
9
SPRING BOOT
In questo modo non è necessario dover configurare un web server in cui deployare l’app ma basterà avviare
l’app e il web server sarà avviato automaticamente con l’applicazione deployata al suo interno.
Tomcat è open source e sviluppato dalla Apache Software Foundation, che implementa diverse specifiche
come JavaServer Pages e servlet, fornendo quindi una piattaforma software per l'esecuzione di applicazioni
web sviluppate in Java.
Tomcat include anche funzionalità di web server tradizionali, ereditate da Apache HTTP Server.
10
SPRING BOOT
Creazione progetto
Creare un’applicazione con Spring Boot è estremamente semplice.
Tramite Spring Initializer è possibile generare un progetto Spring Boot con pochi click. Integrato nella
maggior parte degli IDE, è anche disponibile online (https://start.spring.io).
Le dipendenze si gestiscono come per Spring, ad esempio con un file pom.xml nel caso di Maven.
È possibile selezionare un pool di dipendenze di partenza al momento della creazione del progetto.
11
SPRING BOOT
12
SPRING BOOT
Struttura progetto
Un progetto Spring Boot ha sempre:
● Un file pom.xml;
● Una directory src/main/java in cui scrivere il codice
dell’applicazione;
● Una directory src/main/resources in cui aggiungere risorse
statiche o configurazioni;
● Una directory src/test in cui scrivere i test per il codice
dell’applicazione;
● Una classe <Nome>Application.java contente lo starting point
dell’applicazione.
13
SPRING BOOT
14
SPRING BOOT
Queste proprietà possono essere specificate all'interno del file application.properties o del file
application.yml.
15
SPRING
STEREOTYPE
Gli oggetti gestiti dal container sono detti Spring Beans e sono gestiti tramite la dependency injection.
Il container riceve istruzioni su quali oggetti istanziare, configurare e gestire tramite i metadati di
configurazione forniti.
16
SPRING
STEREOTYPE
Spring Stereotype
Spring fornisce annotazioni speciali usate per creare automaticamente i bean nel contesto
dell'applicazione.
L'annotazione @Component rappresenta lo stereotype principale e generico per definire uno Spring Bean.
17
SPRING
STEREOTYPE
@Repository: una classe è annotata con @Repository per indicare che si occupa di operazioni CRUD, di solito
viene utilizzata con implementazioni DAO (Data Access Object) o repository che interagiscono con database,
cache, ecc.
@Controller: una classe annotata con @Controller indica una componente responsabile di gestire le richieste
degli utenti e restituire la risposta appropriata, che può anche essere HTML.
@RestController: una classe annotata con @RestController è simile ad una classe annotata con @Controller
ma che si occupa solo di API backend e quindi invierà solo risposte in formati come JSON.
18
SPRING
STEREOTYPE
Esempio @Component
19
SPRING
STEREOTYPE
@Configuration e @Bean
Una delle annotazioni più importanti in Spring è l'annotazione @Configuration.
@Configuration indica che la classe ha metodi annotati con @Bean e che quindi definiscono come creare
particolari Spring Bean necessari all’applicazione.
Spring al momento di creare il bean della classe @Configuration, genererà i Spring Bean definiti dai metodi
@Bean, che potranno essere usati tramite dependency injection.
20
SPRING
STEREOTYPE
La maniera in cui il container gestisce il ciclo di vita del bean, definisce lo scope del bean.
Esempi di scopo:
● Singleton;
● Request;
● Session;
● Prototype.
21
SPRING WEB MVC
22
SPRING WEB MVC
@Controller e @RestController
Spring Web Consente di creare bean controller per gestire le richieste HTTP in ingresso, tramite le annotazioni
@Controller o @RestController.
Il mapping dei controller alle richieste HTTP avviene utilizzando l’annotazione @RequestMapping, che indica il path
base della richiesta che il controller deve gestire (ad es. /users).
I metodi dei controller vengono etichettati con annotazioni che permettono di specificare il path della richiesta HTTP
che il singolo metodo deve gestire: @GetMapping, @PostMapping, @DeleteMapping, ecc.
● Permettono anche di specificare parti del path da usare come variabili (vedremo dopo un esempio).
23
SPRING WEB MVC
Esempio di @RestController
Il controller UserController gestirà le richieste all’URL
https://my-domain/users.
Nel dettaglio:
● Il metodo getUsers() gestirà le richieste GET
all’URL https://my-domain/users.
● Il metodo saveUser() gestirà le richieste POST
all’URL https://my-domain/users.
● Il metodo deleteUsers() gestirà le richieste DELETE
all’URL https://my-domain/users/delete-users.
24
SPRING WEB MVC
25
SPRING WEB MVC
26
SPRING WEB MVC
@Service e @Autowired
Buona pratica di sviluppo prevede che i controller si occupino solo della gestione della richieste e risposte e che la
logica di business dell’applicazione sia gestita da dei servizi.
I servizi vengono forniti ai controller tramite dependency injection. La dependency injection in Spring è dichiarata
tramite l’annotazione @Autowired.
Implementare un servizio prevede la definizione di un’interfaccia e una classe per implementare i metodi definiti da
annotare con l’annotazione @Service.
27
SPRING WEB MVC
Esempio @Service
Interfaccia Implementazione
28
SPRING WEB MVC
Esempio @Autowired
Facciamo dependency injection del servizio nel controller.
29
SPRING WEB MVC
Filtri
I filtri vengono eseguiti prima della DispatcherServlet e quindi prima che le richieste siano gestite dall'applicazione.
Possiamo utilizzare i filtri per manipolare e bloccare le richieste in ingresso prima che raggiungano i controller.
Allo stesso modo, possiamo anche bloccare le risposte prima che raggiungano il client.
31
SPRING WEB MVC
Esempio Filtro
Il filtro intercetta solo le richieste per il path /users come
definito dal metodo shouldNotFilter().
32
SPRING WEB MVC
Handler Interceptor
Eseguiti dopo la DispatcherServlet e forniscono metodi per eseguire logica:
● Prima che le richieste siano gestite dai controller;
● Dopo che sono state gestite dai controller ma prima che vengano renderizzate eventuali pagine;
● Dopo il completamento della richiesta.
33
SPRING WEB MVC
34
SPRING DATA
Spring Data
La missione di Spring Data è fornire un modello di programmazione Spring-based per l'accesso ai dati.
Semplifica l'uso di tecnologie di storage, come database relazionali e non relazionali, framework di
map-reduce, servizi di dati basati su cloud, ecc.
Spring Data è una famiglia di moduli che contiene numerosi sotto-moduli specifici per tecnologia.
Un modulo di base Spring Data Commons funge da building block per tutti gli altri moduli.
35
SPRING DATA
36
SPRING DATA
Gestire l’accesso ai dati per un'applicazione può essere oneroso. Tanto codice boilerplate può dover essere
scritto per eseguire anche le query più semplici e se si aggiungono funzionalità come la paginazione, l'auditing
e altre opzioni spesso necessarie, il boilerplate e la complessità aumentano.
Spring Data JPA mira a migliorare l'implementazione di funzionalità tipiche per l’accesso ai dati riducendo lo
sforzo di sviluppo.
● Tipicamente la definizione di interfacce per repository a cui Spring fornirà una implementazione.
37
SPRING DATA
Hibernate è un Object Relational Mapping (ORM) che permette di semplificare la gestione dello strato di
persistenza delle applicazioni.
Hibernate è anche un'implementazione della specifica JPA. Di conseguenza, può essere facilmente utilizzato
in qualsiasi ambiente che supporti JPA, incluse le applicazioni Java SE e Java EE.
Spring Data JPA è un’astrazione al di sopra di Hibernate che lo compatibile con il framework Spring.
38
SPRING DATA
39
SPRING DATA
Si utilizzano delle proprietà definite da Spring Data JPA nel file application.properties.
40
SPRING DATA
Entità
Oggetti POJO che rappresentano dati che possono essere memorizzati nel database.
41
SPRING DATA
42
SPRING DATA
43
SPRING DATA
44
SPRING SESSION
Spring Session
Spring Session ha l'obiettivo di superare i limiti attuali della gestione delle sessioni HTTP memorizzate direttamente
sui web server.
Facilita la condivisione dei dati di sessione tra servizi locali o anche nel cloud senza essere vincolati a un singolo
contenitore per la sessione (ad esempio Tomcat).
● Può aiutare ad alleggerire il carico di memoria del server, ad esempio.
45
SPRING SESSION
Redis
Redis è un progetto open source che fornisce uno store in-memory di coppie chiave-valore.
Redis offre una serie di strutture dati in memoria molto versatili, che permettono di supportare un'ampia gamma di
applicazioni con diverse necessità.
Tra i principali casi d'uso per Redis ci sono il caching e la gestione di sessioni.
46
SPRING SESSION
E utilizzare la sessione
come nell’esempio:
47
SPRING SECURITY
Spring Security
Spring Security è un framework potente e altamente personalizzabile per l'autenticazione e il controllo degli
accessi.
Come tutti i moduli Spring, la vera potenza di Spring Security si trova nella facilità con cui può essere esteso per
soddisfare requisiti personalizzati.
48
SPRING SECURITY
Abilitare Spring Security creando una classe con le annotazione @Configuration e @EnableWebSecurity.
49
SPRING SECURITY
50
SPRING SECURITY
51
SPRING SECURITY
Flusso di autenticazione
52
SPRING SECURITY
53
SPRING CLOUD
Spring Cloud
Spring Cloud fornisce strumenti per consentire agli sviluppatori di sviluppare e gestire agilmente alcuni dei
pattern comuni nei sistemi distribuiti.
Esempi: service discovery, API gateway, circuit breaker, lock globali, sessioni distribuite, ecc.
Con Spring Cloud è possibile ottenere soluzioni a problematiche comuni con effort minore.
54
SPRING CLOUD
API Gateway
L’API gateway è il singolo punto d’ingresso per tutti i client
ai dati o ai servizi back-end.
55
SPRING CLOUD
Service Discovery
Un’applicazione distribuita è eseguita in ambienti dove il numero di istanze dei servizi e la loro locazione
cambiano dinamicamente.
Risulta necessario un meccanismo che permetta ai client di un servizio di inviare richieste ad un insieme di
istanze di servizi che cambia dinamicamente.
La service discovery permette a client, API gateway e altri servizi di scoprire la locazione delle istanze di un
servizio.
Distinguiamo:
● client-side service discovery
● server-side service discovery
56
SPRING CLOUD
Service Registry
Il service registry è un database dei servizi, delle loro istanze e delle loro locazioni.
I servizi si registrano durante la fase di avvio e rimuovono la propria registrazione durante la fase di
spegnimento.
57
SPRING CLOUD
58
SPRING CLOUD
59
SPRING CLOUD
Netflix OSS
Soluzioni software open-source sviluppate da Netflix (https://github.com/Netflix).
Alcune di queste soluzione sono state integrate da Spring all’interno di Spring Cloud.
Esempi:
● Zuul: un API gateway a livello 7 che offre funzionalità per routing dinamico, monitoraggio, resilienza,
sicurezza, ecc.
● Eureka: un servizio utilizzato per service discovery, bilanciamento del carico e il failover, che gioca un
ruolo critico anche nell'infrastruttura di Netflix.
● Hystrix: è una soluzione di circuit breaking progettata per isolare punti di accesso in caso di fallimento
per fermare il fallimento a cascata di servizi dipendenti punto di accesso.
60
SPRING CLOUD
Tramite annotazioni è possibile abilitare e configurare rapidamente pattern comuni all'interno delle
applicazioni in ambiente distribuito.
Ad esempio, permette di creare un Server Eureka che gestisca il service registry e poi far si che le applicazioni
si registrino a questo server.
61
SPRING CLOUD
62
SPRING CLOUD
63
SPRING CLOUD
64
SPRING CLOUD
65
SPRING CLOUD
66
SPRING CLOUD
67
SPRING CLOUD
Thymeleaf
Thymeleaf è un template engine per Java per elaborare e gestire HTML, XML, JavaScript e CSS.
E creare una directory templates nella directory src/main/resources del progetto, dove aggiungere le pagine
HTML create.
69
THYMELEAF
70
THYMELEAF
71
TIPS E
AMBIENTE
Librerie utili
● Lombok: libreria per l’autogenerazione di boilerplate tramite annotazioni. Ad esempio @Getter per
generare metodi getter per tutti i campi di una classe;
● ModelMapper: libreria per la conversione tra oggetti istanze di due classi Java per ridurre il boilerplate;
● Jackson: libreria per serializzare e deserializzare JSON in Java (esiste anche per XML);
● Apache Commons: fornisce una serie di librerie per semplificare la gestione di stringhe, collezioni, ecc.
72
TIPS E
AMBIENTE
Esempio Lombok
Aggiungiamo la dipendenza per Lombok.
73
TIPS E
AMBIENTE
Esempio ModelMapper
Aggiungiamo la dipendenza:
Sviluppiamo una classe UserMapper che usa ModelMapper per convertire le istanze di una classe UserEntity in delle
istanze di una classe UserDTO:
74
TIPS E
AMBIENTE
Esempio Jackson
Aggiungiamo la dipendenza:
Sviluppiamo una classe UserSerializer che usa Jackson per serializzare in JSON le istanze di una classe UserDTO:
75
TIPS E
AMBIENTE
Ambiente di sviluppo
IDE & Text Editor
76
TIPS E
AMBIENTE
Ambiente di sviluppo
Framework
Version Control
77
TIPS E
AMBIENTE
Ambiente di sviluppo
Monitoraggio e gestione delle applicazioni
78
TIPS E
AMBIENTE
Ambiente di sviluppo
Caching & Comunicazione Autenticazione e autorizzazione
Database
79
Domande?
Esempio Pratico
Prossimamente su
https://github.com/tizianocitro/pdtify
Tiziano Citro