2. Introduzione
• Spring è un framework applicativo, open source, che ha l’obiettivo semplificare lo sviluppo di
applicazioni Java di tipo enterprise.
• Creato nel 2002 come approccio alternativo alla piattaforma Java EE per raggiungere scopi
analoghi con un modello di programmazione più semplice e più leggero.
• Il suo successo è stato tale da aver profondamente influenzalo l’evoluzione della specifica EJB.
• Oggi Spring è un framework modulare, in grado di supportare una varietà di necessità applicative:
come le applicazioni web, la sicurezza, i big data e il cloud.
1Ml download
VM-Ware
Pivotal
Struts
(2000)
Hibernate
(2001)
EJB3
(2000)
3. IoC Vs DI
• La caratteristica per la quale Spring è maggiormente riconosciuto è la
sua implementazione del pattern Dependency Injection che è uno
degli aspetti fondamentali dell’Inversion of Control (IoC).
• IoC: è un principio dell'ingegneria del software grazie al quale il
controllo di oggetti o porzioni di un programma viene trasferito a un
contenitore o framework. Può essere ottenuto in diversi modi:
Strategy design pattern, Service Locator pattern, Factory pattern, and
Dependency Injection (DI).
• DI: è una implementazione dell’IoC in cui il controllo invertito è
l’impostazione delle dipendenze di un oggetto.
4. Core Coponents
• Il modulo core è la componente fondamentale del framework ed
implementa la Dependency Injection;
• Il bean module fornisce le classi factory per l’istanziazione dei bean;
• Il modulo context, implementato al di sopra dei moduli core e bean,
fornisce l’accesso a tutti i bean definiti in funzione dei relativi contesti;
• Il modulo SpEL fornisce un expression language per la manipolazione
dei bean a runtime.
5. Approccio Tradizionale
Object A
Object B
Object C
Class B
Class C
• Per utilizzare l’oggetto B, l’oggetto A lo
deve istanziare dalla Classe B.
• Per utilizzare l’oggetto C, l’oggetto B lo
deve istanziare dalla Classe C.
6. Problemi e limitazioni
• Le classi sono fortemente accoppiate;
• Difficile da testare;
• Non favoriscono il riuso;
• Difficili da comprendere (il flusso principale è poco evidente);
• Difficile da manutenere;
• L’utilizzo delle interfacce non risolvono il problema ????
7. Nuovo Approccio
…
<beans>
<bean id=A class=A>
<property name=b>
<ref bean=B>
</property>
</bean>
<bean id=B class=B>
<property name=c>
<ref bean=C>
</property>
</bean>
<bean id=C class=C/>
</beans>
Class B{
private CGroup c;
…
Public void setCGroup(CGroup c){
this.c = c;
}
}
Class C
Class A{
private BGroup b;
…
Public void setBGroup(BGroup b){
this.b = b;
}
}
Interface BGroup
Class B’
Class B’’
Interface CGroup
Class C’
Class C’’
changes
8. Concetti
• Due forme di DI: Setter Injection e Constructor Injection;
• Disaccoppiamento del codice garantito dall’utilizzo delle interfacce;
• Spring IoC Container è la piattaforma mentre la bena factory produce
i bean;
17. Gestione delle Transazioni
• Interfaccia che implementa la strategia di gestione delle transazioni:
Implementazioni Utilizzo
DataSourceTransactionManager Gestione di un singolo JDBC DataSource
JtaTransactionManager Utilizza un provider JTA fornito da Java EE
Container o configurato localmente
JpaTransactionManager Utilizza un JPA EntityManagerFactory
HibernateTransactionManager Utilizza un singolo Hibernate SessionFactory
25. Introduzione
• Spring MVC è una delle componenti più utilizzati, dopo Spring Core.
• Rispetto alla soluzione Java Server Faces, che ricordiamo è uno standard J2EE,
Spring MVC è molto più simile alla tecnologia Servlet.
• La principale critica rivolta alle specifica JSF, infatti, è che introduce una eccessiva
astrazione nascondendo concetti di base che è bene conoscere.
27. ContextLoaderListener vs DispatcherServlet
• Spring può gestire più contesti contemporaneamente,
un root context ed uno o più child context.
• ContextLoaderListener crea il root context
dell’applicazione.
• DispatcherServlet crea i child context per ogni
servlet entry.
• Child context possono accedere ai bean definiti nel
root context.
• Bean nel root context non possono accedere
“direttamente” ai bean nel child context.
• Tutti i contesti sono inseriti nel ServletContext.
• La classe WebApplicationContextUtils
permette l’accesso ai root context.
36. Introduzione
• Consente di gestire in modo semplice e trasparente l’autenticazione
(ovvero chi sei) e la profilazione (ovvero cosa sei autorizzato a fare)
degli utenti che accedono ad una applicazione web.
• Implementa funzionalità che fanno fronte alle principali vulnerabilità
(OWASP):
• Cross-site request forgery (CSRF);
• Session Fixation;
• Attacco XSS;
• Etc.
45. Introduzione
• Rispetto J2EE in cui la DI è gestita solamente tramite annotation con
l’XML Spring mantiene separata la configurazione piuttosto che
diffonderla nel codice.
• L’utilizzo dell’XML comporta però diverse conseguenze:
• Non è type-safe e un qualsiasi errore nel file è rilevato esclusivamente allo
startup del contesto di Spring.
• L’XML è verboso al punto da divenire molto grandi in applicazioni
mediamente complesse, per cui si è costretti a suddividere la configurazione
in più file.
• Non è possibile navigare nei vari file di configurazione e per trovare dove un
bean è definito è necessario eseguire una ricerca full-text.
46. Configurazione
Indica al container che
la classe contiene
elementi di
configurazione.
Vengono eseguiti ed il
risultato inserito nel
contesto (<bean>).
ApplicationContext
testBean
bean1
bean2
Risolve l’ambiguità nel
recupero di un bean di
tipo TestBean.
50. Modularizzazione
• Una best practice abbastanza comune è quella di suddividere la
configurazione in diversi classi: es. una per i servizi ed una per i DAO.
1
2
I bean registrati un una
classe di configurazione
diverse possono essere
importati un un’altra
classe semplicemente
utilizzando l’autowiring.
56. Introduzione
• Il suo scopo è di unificare e semplificare l’accesso a differenti tipi di
basi di dati, sia relazionali che non (NoSQL).
• DAO vs Repository.
• Supporta la specifica JPA (quindi tutti gli ORM che la implementano).
• Le entità sono dei POJO annotati con @Entity che hanno un solo
identificativo @Id.
• Il concetto principale del framework è la marker interface Repository:
1 2
57. Gerarchia
Domain Class
(es. Utente)
ID type della
domain class
public interface UserRepository extends CrudRepository<User, Long>
Fornisce funzionalità CRUD
es: save(), delete(), find(), etc.
Aggiunge metodi di paginazione
Page<T> findAll(Pageable pageable);
JPA specific extension
58. Query
• Le query possono essere “derivate” in base al nome del metodo
find…By…, read…By…, query…By…, count…By…, get…By…
Nome dell’entità eventualmente preceduta
da Distinct , Top, First:
- findUserBy…
- findDistinctUserBy…
- queryFirst10By…
- findTop3By…
Elenco delle proprietà con diversi qualificatori:
- findUserByLastnameOrFirstname
- findUserByLastnameAndFirstname
- findUserByLastnameIgnoreCase
- finduserByLastnameAndFirstnameAllIgnoreCase
Property traversal:
59. Named Query
• Binding della query utilizzando l’annotazione JPA @Query
Query JPQL o Native
60. Query By Example
• Consente di generare query a partire da un “esempio” …
62. Introduzione
• E’ un framework per l’elaborazione batch di grandi volumi di dati.
• Sorgenti differenti: database, flat file (xml, csv, etc.), code JMS, JPA, etc.
• Gestione automatica dei retry e failure.
• Tracciamento della stato di esecuzione dei batch.
• Supporto a differenti modalità di avvio dei job: script; http, etc.
• Scomposizione di grandi quantità di dati e processamento parallelo.
63. Componenti
Componente
responsabile
dello start dei
job
Componente responsabile della
conservazione delle
informazioni di esecuzione. Il
repository può essere in-
memory o su DB dedicato
La descrizione
del processo che deve
essere eseguito
Ogni step consiste di
tre attività:
- Data reading.
- Data processing.
- Data writing.
65. Job
Job istanziato sui
parametri di avvio Parametri su cui è
avviato il Job
Contiene informazioni sull’esecuzione del
Job:
- stato,
- data ed ora di avvio e completamento,
- eventuale eccezione,
- etc.
La singola esecuzione di uno step che
contiene tutte le informazioni di
esecuzione:
- stato,
- data ed ora di avvio e completamento,
- numero di letture,
- scritture e commit,
66. Elaborazione
• Elaborazione a chunk (blocchi).
• I dati vengono letti e processati a blocchi utilizzando l’ItemReader e
l’ItemProcessor.
• Solamente quando è raggiunto l’intervallo di commit richiesto, l’intero
blocco è passato all’ItemWriter.
72. Schedulazione
• Per la schedulazione dei job è necessario integrare un tool che si
occupa dell’avvio temporizzato dei batch: TaskScheduler di Spring e il
più noto Quartz.
74. Introduzione
• Spring Boot è una soluzione per realizzare in modo semplice
applicazioni su piattaforma Spring, producendo stand-alone App
eseguibili in java.
• Includono Tomcat, Jetty o Undertow (no WAR but JAR).
• Configurazione completa con Spring JavaConfig (no XML).
• Focalizzato sui Microservizi.
• Spring Inizializer: https://start.spring.io
78. Introduzione
• Spring Integration è una architettura di
messaggistica che fornisce una
implementazione dei pattern EIP, mettendo
a disposizione una serie di componenti che
possono essere combinati per realizzare
un’applicazione EAI.
• Enterprise Application Integration (EAI) si
riferisca da un software o ad una
architettura software in grado di integrare
applicazioni enterprise eterogenee.
79. Componenti Principali
1. Producer (sender) ed i consumer (receiver) detti endpoint che si scambiano
messaggi;
2. Pipe dette anche channel che rappresentano i canali di comunicazione tra
producer e consumer;
3. Messaggi che trasportano l’informazione scambiata.
82. PayPal 4 Dummies
• BASE
• Interfaccia di Login e Registrazione dei propri dati carta
• Servizio REST di pagamento
• Batch di rendicontazione
• AVANZATO
• Integrare servizio bancario di pagamento
Editor's Notes
Entrambi gli approcci quindi hanno vantaggi e svantaggi, però riportare la configurazione nel codice ha diverse implicazioni interessanti:
Tutti gli IDE supportano il type-checking, il code completion, il refactoring e la ricerca delle referenze nel codice.
Per uno sviluppatore java è molto più semplice codificare concetti come: creazione di bean, inizializzazione, etc. in java piuttosto che con inventare metodi complicati in XML.
l’uso di design pattern specifici possono rendere il codice (di configurazione) chiaro e leggibile.
JavaConfig si candida quindi come una valida alternativa sia all’uso dell’XML che all’autowiring. Esso infatti unisce il vantaggio del disaccoppiamento dell’XML con il compile-time check di Java. In un certo senso JavaConfig può essere visto come l’equivalente di un file XML ma codificato in linguaggio Java.