Spring Framework
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)
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.
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.
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.
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 ????
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
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;
Spring Bean factory
ClassPathXmlApplicationContext
XmlWebApplicationContext
web.xml
org.springframework.web.context.ContextLoaderListener
implements
javax.servlet.ServletContextListener
ContextLoaderListenerapplicationContext.xml
ServletContext
WebApplicationContext
Annotazioni
Stereotype Annotation
Context Configuration Annotation
JSR-330 -> @Inject
Spring Lifecycle
XML
InitializingBean
DisposableBean
JSR-250
Spring Framework
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
DataSourceTransactionManager
JtaTransactionManager
HibernateTransactionManager
Declarative Transaction Definition
Approccio Basato sulle Annotazioni
<tx:annotation-driven transaction-manager="txManager"/>
Configurazione
ISOLATION LEVEL
TRANSACTION ATTRIBUTES
Spring MVC
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.
DispatcherServlet
• Analoga alla FacesServlet di JSF e ActionServlet di Struts;
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.
Definizione del Contesto
<context:component-scan>
@Component
@Repository
@Service
@Controller
<mvc:annotation-driven/>
@Controller
@RequestMapping
@Valid
@RequestBody
@ResponseBody
<context:annotation-config>
@Autowired
@Qualifier
(es. serializzazione degli oggetti in XML con
JAXB)
Login Servlet
login.jsp LoginServlet
Login Controller
login.jsp LoginController
@RequestHeader, @CookieValue, @RequestBody, …
View Resolver
Le jsp sono nella cartella WEB-INF
e quindi accessibili
esclusivamente tramite servlet.
Approfondimenti
Path Variable
Parametri della Request
Approfondimenti
Parametri nell’Header
Accesso ai Cookie
Approfondimenti
Request Body
Spring Security
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.
DelegatingFilterProxy
Reserved Name
ContextLoaderListener
spring-security.xml
Abilita la web security
Definisce il servizio di autenticazione
Password encoder
Authentication Provider
Custom Provider bcrypt: funzione
hashing basata
sulla cifratura
Blowfish.
Mai restituire null.
Più metodi di
autenticazione
Ruoli e Privilegi
Database Provider
JdbcDaoImpl
UserDetailsService
1
2
alternativi
Ruoli e Privilegi
Filtro sulle URI
Filtro sulle componenti della VIEW
Ruoli e Privilegi
Spring JavaConfig
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.
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.
JavaConfig
AnnotationConfigApplicationContext
Bean Scope
Standard: singleton e prototype
Spring MVC: request e session
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.
Gestione dei Profili
ProfiledBean
<interface>
ProfiledBeanA ProfiledBeanB
Registrazione del profilo
web.xml
Java main()
JavaConfig vs SpringMVC
<mvc:annotation-driven />
JavaConfig vs SpringMVC
• Sostituisce la definizione della DispatcherServlet sul file web.xml
(Servlet 3.0)
JavaConfig vs Spring Security
Spring Data
(cenni)
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
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
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:
Named Query
• Binding della query utilizzando l’annotazione JPA @Query
Query JPQL o Native
Query By Example
• Consente di generare query a partire da un “esempio” …
Spring Batch
(cenni)
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.
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.
Componenti
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,
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.
ItemReader
Interfaccia per lettura su
input generico
ItemProcessor
Dato un oggetto lo
trasforma in qualcosa di
altro.
ItemWriter
Interfaccia per scrittura su
output generico
Definizione XML del Job
Esecuzione
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.
Spring Boot
(cenni)
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
Esposizione di un Microservizio
@Controller
@ResponseBody
Consumo di un Microservizio
Tipo restituito
Spring Integration
(cenni)
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.
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.
Riferimenti
http://www.javaboss.it/primi-passi-spring-core/
http://www.javaboss.it/spring-lifecycle/
http://www.javaboss.it/primi-passi-spring-batch/
http://www.javaboss.it/primi-passi-spring-boot/
http://www.javaboss.it/spring-javaconfig-parte-1/
http://www.javaboss.it/spring-integration-parte-1/
http://www.javaboss.it/primi-passi-con-spring-mvc-parte-1/
http://www.javaboss.it/spring-security-parte-1/
http://www.javaboss.it/invocazione-di-servizi-restful-con-resttemplate/
PayPal 4 Dummies
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

Spring - Ecosistema

Editor's Notes

  • #46 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.