Talk codemotion 2013 - La sostenibile leggerezza di Spring

Post on 01-Nov-2014

752 views 1 download

Tags:

description

Ovvero, come migliorare il nostro team e la nostra produttività utilizzando Spring Framework

Transcript of Talk codemotion 2013 - La sostenibile leggerezza di Spring

La sostenibile leggerezza di Spring! Ovvero, come migliorare il nostro team e la nostra produttività utilizzando Spring Framework.

Daniele La Nave

dlanave@extrema-sistemas.com

Spring Certified Trainer & Specialist @ Extrema Sistemas

Capitolo 1

Daniele La Nave

Come portare il nostro team,bendato e con i tappi alle orecchie, alla piena

comprensione dell’ OOP utilizzando Spring

dlanave@extrema-sistemas.com - Extrema Sistemas

Come portare il nostro team, bendato e con i tappi alle orecchie, alla piena comprensione dell’OOP utilizzando Spring

Daniele La Nave

…..eh ?

Perché bendato e con i tappi alle orecchie ?

dlanave@extrema-sistemas.com - Extrema Sistemas

Come portare il nostro team, bendato e con i tappi alle orecchie, alla piena comprensione dell’OOP utilizzando Spring

Daniele La Nave

Risposte:

1. Capita, quando si realizza un software, di essere concentrati a soddisfare i requisiti del cliente e meno attenti alle linee guida ed i concetti legati ad una buona progettazione dell’architettura

dlanave@extrema-sistemas.com - Extrema Sistemas

Come portare il nostro team, bendato e con i tappi alle orecchie, alla piena comprensione dell’OOP utilizzando Spring

Daniele La Nave

“Vorrei un’ icona di color blu sul mio desktop… …che, se cliccata, scateni il lancio di ordigno di fine di mondo!!!”

dlanave@extrema-sistemas.com - Extrema Sistemas

Risposte:

2. Un’ azienda deve, necessariamente, essere produttiva, competitiva, ed in grado di far fronte alle eventuali

“turbe” dei clienti. Es:

Come portare il nostro team, bendato e con i tappi alle orecchie, alla piena comprensione dell’OOP utilizzando Spring

Daniele La Nave

Risposte:

3. “Lo voglio pronto per la prossima settimana! Anzi, lo voglio pronto per domani!!”

dlanave@extrema-sistemas.com - Extrema Sistemas

Come portare il nostro team, bendato e con i tappi alle orecchie, alla piena comprensione dell’OOP utilizzando Spring

Daniele La Nave

Ironia a parte, quanto descritto fin ora può causare

dei pericolosi corto-circuiti tra reparti dell’azienda:

dlanave@extrema-sistemas.com - Extrema Sistemas

Settore Commerciale Vs. Settore Sviluppo

Oppure, in altri termini, una volta “rotto” il circuito

“Fighetti” Vs. “Autistici”

Come portare il nostro team, bendato e con i tappi alle orecchie, alla piena comprensione dell’OOP utilizzando Spring

Daniele La Nave

In realtà, tutti e due i reparti sono “vitali” per la

salute di un’ azienda perché:

• Inefficienza dei commerciali = Niente clienti

• Inefficienza degli sviluppatori = Niente prodotti

Bisogna quindi difendere l’operato di tutti i reparti!

(Siamo tutti sulla stessa barca, mai dimenticarlo!!)

dlanave@extrema-sistemas.com - Extrema Sistemas

Come portare il nostro team, bendato e con i tappi alle orecchie, alla piena comprensione dell’OOP utilizzando Spring

Daniele La Nave

...e quindi ?

Se i tempi sono corti ed i requisiti “complessi”,

come possiamo far contenti tutti ?

dlanave@extrema-sistemas.com - Extrema Sistemas

Come portare il nostro team, bendato e con i tappi alle orecchie, alla piena comprensione dell’OOP utilizzando Spring

Daniele La Nave

I principi fondamentali per l’OOP ci dicono che dovremmo

evitare 3 caratteristiche che denotano il “cattivo” design di

un’ applicazione:

1. Rigidità (il cambiamento di un requisito richiede il cambiamento di molte parti del sistema)

2. Fragilità (il cambiamento di un requisito interrompe il corretto funzionamento del sistema)

3. Immobilità (impossibilità o difficoltà di riutilizzo delle stesse componenti su più di un’ applicazione)

dlanave@extrema-sistemas.com - Extrema Sistemas

Come portare il nostro team, bendato e con i tappi alle orecchie, alla piena comprensione dell’OOP utilizzando Spring

Daniele La Nave

Per evitare queste caratteristiche di “bad design” sono state

definite, nel corso degli anni, delle linee guida per aiutarci a

sviluppare software che non risentano di tali sintomi,

ovvero:

The Software Design Principles

dlanave@extrema-sistemas.com - Extrema Sistemas

Come portare il nostro team, bendato e con i tappi alle orecchie, alla piena comprensione dell’OOP utilizzando Spring

Daniele La Nave

Open Close Principle

Classi, moduli, funzioni dovrebbero essere “Aperte” per

l’estensione e “Chiuse” per la modifica

Dependency Inversion Principle

I moduli a più alto livello non

dovrebbero dipendere dai moduli di livello più basso, entrambi

dovrebbero dipendere solo dalla loro astrazione

Interface Segregation Principle

I Client non dovrebbero

essere forzati ad implementare interfacce che

non utilizzano

Single Responsibility Principle

Una classe dovrebbe avere

solo una singola ragione per essere modificata

Liskov’s Substitution Principle

Le classi derivate devono

poter sostituire completamente quelle di

base

dlanave@extrema-sistemas.com - Extrema Sistemas

Come portare il nostro team, bendato e con i tappi alle orecchie, alla piena comprensione dell’OOP utilizzando Spring

Daniele La Nave

Sulla base di questi principi, è stata creata una serie di

modelli per la Programmazione Orientata agli Oggetti:

The Design Patterns (by GoF) (Sono circa 25, divisi in 3 categorie)

Creazionali, Comportamentali, Strutturali

dlanave@extrema-sistemas.com - Extrema Sistemas

Come portare il nostro team, bendato e con i tappi alle orecchie, alla piena comprensione dell’OOP utilizzando Spring

Daniele La Nave

Però…

• Non tutti gli sviluppatori sanno come utilizzarli

• Un uso sbagliato può portare il progetto oltre “l’orizzonte degli eventi!”

• Potrebbe risultare difficile far capire, ai “non addetti ai lavori”, perché implementarli

Ma allora, come tenere sotto controllo il progetto ?

dlanave@extrema-sistemas.com - Extrema Sistemas

Come portare il nostro team, bendato e con i tappi alle orecchie, alla piena comprensione dell’OOP utilizzando Spring

Daniele La Nave

La soluzione esiste, ed è apprezzata da milioni di

sviluppatori: Spring Framework

dlanave@extrema-sistemas.com - Extrema Sistemas

Modularità Produttività Portabilità Testabilità

Come portare il nostro team, bendato e con i tappi alle orecchie, alla piena comprensione dell’OOP utilizzando Spring

Daniele La Nave

Principalmente, Spring ci chiede solo

di seguire alcune regole definite come

“fondamentali”:

• DRY Principle = “Don’t Repeat Yourself”

• SoC Principle = “Separation of Concern”

(segue)

dlanave@extrema-sistemas.com - Extrema Sistemas

Come portare il nostro team, bendato e con i tappi alle orecchie, alla piena comprensione dell’OOP utilizzando Spring

Daniele La Nave

E, per quel che riguarda il Design

della nostra applicazione, sviluppare:

1. Basandoci sulle interfacce Astrazione dei componenti = loose coupling

2. Preferendo la composizione all’ereditarietà Favorendo, di fatto, la modularità

3. Componendo l’architettura a layer Service, Data Access & Infrastructure è un classico!

dlanave@extrema-sistemas.com - Extrema Sistemas

Come portare il nostro team, bendato e con i tappi alle orecchie, alla piena comprensione dell’OOP utilizzando Spring

Daniele La Nave

Quindi si!

…Bendati e con i tappi alle orecchie!

…Indaffarati nel soddisfare le richieste del cliente!

Contando, però, su di un Framework in grado di dare pieno

supporto infrastrutturale per il Design della nostra

architettura.

dlanave@extrema-sistemas.com - Extrema Sistemas

Capitolo 2

Daniele La Nave

“Fatto! …Già fatto??”

Codice più efficiente e, soprattutto,

In minor quantità

dlanave@extrema-sistemas.com - Extrema Sistemas

Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor quantità

Daniele La Nave

Fitness Club Application

Requisiti cliente:

• Desktop App (Standalone)

• Gestione clienti del club

• Gestione delle sottoscrizioni alle attività

dlanave@extrema-sistemas.com - Extrema Sistemas

Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor quantità

Daniele La Nave dlanave@extrema-sistemas.com - Extrema Sistemas

Domain Objects

<<Java Class>> Activity

<<Java Class>> Subscription

<<Java Class>> Member

<<Java Class>> Customer

<<Java Class>> Address

Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor quantità

Daniele La Nave dlanave@extrema-sistemas.com - Extrema Sistemas

Data Access Layer

<<Java Interface>> ActivityRepository

<<Java Interface>> SubscriptionRepository

<<Java Interface>> MemberRepository

<<Java Interface>> CustomerRepository

<<Java Interface>> AddressRepository

Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor quantità

Daniele La Nave dlanave@extrema-sistemas.com - Extrema Sistemas

Service Layer

<<Java Interface>> CustomerManagerService

<<Java Interface>> FitnessClubService

Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor quantità

Daniele La Nave dlanave@extrema-sistemas.com - Extrema Sistemas

Data Access Layer (implementazione)

<<Java Interface>> ActivityRepository

<<Java Class>> JdbcActivityRepository

<<Java Interface>> DataSource

Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor quantità

Daniele La Nave dlanave@extrema-sistemas.com - Extrema Sistemas

Data Access Layer (implementazione)

<<Java Interface>> ActivityRepository

<<Java Class>> HibernateActivityRepository

<<Java Interface>> SessionFactory

Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor quantità

Daniele La Nave dlanave@extrema-sistemas.com - Extrema Sistemas

Service Layer (implementazione)

<<Java Interface>> FitnessClubService

<<Java Class>> FitnessClubServiceImpl

<<Java Interface>> CustomerManagerService

<<Java Class>> CustomerManagerServiceImpl

<<Java Interface>> SubscriptionRepository

<<Java Interface>> MemberRepository

<<Java Interface>> CustomerRepository

<<Java Interface>> AddressRepository

Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor quantità

Daniele La Nave

I componenti della nostra applicazione sono pronti!

Passiamo ora alla configurazione di Spring

dlanave@extrema-sistemas.com - Extrema Sistemas

Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor quantità

Daniele La Nave

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="com.mysql.jdbc.Driver"/>

<property name="url" value="jdbc:mysql://localhost:3306/fitnessclubdb"/>

<property name="username" value="fitnessclubdbuser"/>

<property name="password" value="ItsASecret!"/>

</bean>

Oppure, se gestito da Java EE Container:

<jee:jndi-lookup id="dataSource" jndi-name="jdbc/fitnessclubdb"/>

dlanave@extrema-sistemas.com - Extrema Sistemas

db-config.xml

Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor quantità

Daniele La Nave

<jdbc:embedded-database id="dataSource">

<jdbc:script location="classpath:schema.sql"/>

<jdbc:script location="classpath:test-data.sql"/>

</jdbc:embedded-database>

dlanave@extrema-sistemas.com - Extrema Sistemas

test-db-config.xml

Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor quantità

Daniele La Nave

<bean id="sessionFactory"

class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">

<property name="dataSource" ref="dataSource" />

<property name="packagesToScan" value=“com.extremasistemas.fitnessclub.entities" />

<property name="hibernateProperties">

<value> …</value>

</property>

</bean>

dlanave@extrema-sistemas.com - Extrema Sistemas

hibernate-config.xml

Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor quantità

Daniele La Nave

<bean id="customerRepository"

class=" com.extremasistemas.examples.fitnessclub.repository.JdbcCustomerRepository ">

<constructor-arg ref="dataSource" />

</bean>

Oppure, utilizzando Hibernate:

<bean id="customerRepository"

class=" com.extremasistemas.examples.fitnessclub.repository.HibernateCustomerRepository ">

<constructor-arg ref="sessionFactory" />

</bean>

dlanave@extrema-sistemas.com - Extrema Sistemas

data-access-config.xml

Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor quantità

Daniele La Nave

<bean id="customerManagerService"

class="com.extremasistemas.examples.fitnessclub.service.CustomerManagerServiceImpl">

<constructor-arg ref="customerRepository" />

<constructor-arg ref="addressRepository" />

</bean>

<bean id="fitenessClubService"

class="com.extremasistemas.examples.fitnessclub.service.FitnessClubServiceImpl">

<constructor-arg ref="customerManagerService " />

<constructor-arg ref="memberRepository " />

<constructor-arg ref="subscriptionRepository" />

</bean>

dlanave@extrema-sistemas.com - Extrema Sistemas

application-config.xml

Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor quantità

Daniele La Nave dlanave@extrema-sistemas.com - Extrema Sistemas

Grafico delle dipendenze dei Bean

Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor quantità

Daniele La Nave

Ora che abbiamo definito la configurazione..

…”Miwa (Spring), lanciami i componenti!”

dlanave@extrema-sistemas.com - Extrema Sistemas

Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor quantità

Daniele La Nave

Ora che abbiamo definito la configurazione..

…”Miwa (Spring), lanciami i componenti!”

dlanave@extrema-sistemas.com - Extrema Sistemas

Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor quantità

Daniele La Nave

“Mmmhhhh.. ma scrivere meno XML, no eh ?”

(DI utilizzando le annotazioni ed il “component-scan”)

dlanave@extrema-sistemas.com - Extrema Sistemas

Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor quantità

Daniele La Nave dlanave@extrema-sistemas.com - Extrema Sistemas

Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor quantità

Daniele La Nave dlanave@extrema-sistemas.com - Extrema Sistemas

Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor quantità

Daniele La Nave

<context:component-scan base-package="com.extremasistemas.examples.fitnessclub" />

dlanave@extrema-sistemas.com - Extrema Sistemas

application-config.xml

Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor quantità

Daniele La Nave dlanave@extrema-sistemas.com - Extrema Sistemas

Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor quantità

Daniele La Nave

“Ma questa applicazione non usa le transazioni !!”

(Come applicare le proprietà ACID in 5 minuti)

dlanave@extrema-sistemas.com - Extrema Sistemas

Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor quantità

Daniele La Nave

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

<property name="dataSource" ref="dataSource"/>

</bean>

Oppure, utilizzando Hibernate:

<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">

<property name="sessionFactory" ref="sessionFactory" />

</bean>

dlanave@extrema-sistemas.com - Extrema Sistemas

transaction-config.xml

Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor quantità

Daniele La Nave

Oppure, se gestito da Java EE Container:

<tx:jta-transaction-manager />

dlanave@extrema-sistemas.com - Extrema Sistemas

transaction-config.xml

Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor quantità

Daniele La Nave dlanave@extrema-sistemas.com - Extrema Sistemas

Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor quantità

Daniele La Nave dlanave@extrema-sistemas.com - Extrema Sistemas

Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor quantità

Daniele La Nave

<context:component-scan base-package="com.extremasistemas.examples.fitnessclub" />

<tx:annotation-driven />

dlanave@extrema-sistemas.com - Extrema Sistemas

application-config.xml

Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor quantità

Daniele La Nave

“Missione compiuta! Transazioni implementate!!”

dlanave@extrema-sistemas.com - Extrema Sistemas

Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor quantità

Daniele La Nave

Riunione con il Cliente…

Requisiti:

• Ho due nuovi impiegati, vorrei che anch’essi utilizzassero l’applicazione.

• Deve rimanere un’ applicazione desktop

• Vorrei che la business logic fosse spostata su un server

• Ma, non voglio un server web!

dlanave@extrema-sistemas.com - Extrema Sistemas

Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor quantità

Daniele La Nave

Remote Method Invocation

“Senza toccare una riga di codice Java”

dlanave@extrema-sistemas.com - Extrema Sistemas

Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor quantità

Daniele La Nave

Come ?

1. Spostando il back-end dell’applicazione su una macchina dedicata

2. Lasciando il solo front-end sui terminali degli operatori

3. Modificando le istruzioni di configurazione di Spring per il back-end ed il front-end.

dlanave@extrema-sistemas.com - Extrema Sistemas

Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor quantità

Daniele La Nave

<context:component-scan base-package="com.extremasistemas.examples.fitnessclub" />

<tx:annotation-driven />

<bean class="org.springframework.remoting.rmi.RmiServiceExporter">

<property name="serviceName" value="FitnessClubService" />

<property name="serviceInterface"

value="com.extremasistemas.examples.fitnessclub.service.FitnessClubService" />

<property name="service" ref="fitnessClubService" />

</bean>

dlanave@extrema-sistemas.com - Extrema Sistemas

application-config.xml (server)

Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor quantità

Daniele La Nave

<bean id=“fitnessClubService" class="org.springframework.remoting.rmi.RmiProxyFactoryBean">

<property name="serviceUrl" value="rmi://HOST:1099/FitnessClubService" />

<property name="serviceInterface"

value=" com.extremasistemas.examples.fitnessclub.service.FitnessClubService " />

</bean>

dlanave@extrema-sistemas.com - Extrema Sistemas

application-config.xml (client)

Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor quantità

Daniele La Nave

Fatto!

“E non abbiamo toccato una sola riga di codice Java!!”

dlanave@extrema-sistemas.com - Extrema Sistemas

Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor quantità

Daniele La Nave

Riunione con il Cliente…

Requisiti:

• Ho vinto al Superenalotto! Apro 10 club sul territorio!!

• Ora voglio che la mia applicazione sia utilizzata via web!

• Voglio comunque mantenere la stessa logica di business

dlanave@extrema-sistemas.com - Extrema Sistemas

Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor quantità

Daniele La Nave

E come ?

Con Spring MVC!

dlanave@extrema-sistemas.com - Extrema Sistemas

Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor quantità

Daniele La Nave

E come ?

1. Mantenendo intatta la configurazione applicativa

2. Configurando l’applicazione web via web.xml

3. Configurando Spring MVC

4. Definendo in nostri Controller

5. Creando i nostri Form

dlanave@extrema-sistemas.com - Extrema Sistemas

Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor quantità

Daniele La Nave

<web-app>

<context-param>

<param-name>contextConfigLocation</param-name>

<param-value>classpath:/META-INF/spring/application-config.xml</param-value>

</context-param>

<listener>

<listener-class>org.springframework.web.context.ContextLoaderListener</servlet-name>

</listener>

dlanave@extrema-sistemas.com - Extrema Sistemas

web.xml

Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor quantità

Daniele La Nave

<servlet>

<servlet-name>fitnessClubApplication</servlet-name>

<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

<init-param>

<param-name>contextConfigLocation</param-name>

<param-value>classpath:/META-INF/spring/web/mvc-config.xml</param-value>

</init-param>

<load-on-startup>1</load-on-startup>

</servlet>

</web-app>

dlanave@extrema-sistemas.com - Extrema Sistemas

web.xml

Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor quantità

Daniele La Nave

<mvc:annotation-driven />

<mvc:default-servlet-handler />

<mvc:view-controller path="/login" view-name="login" />

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">

<property name="prefix" value="/WEB-INF/views/" />

<property name="suffix" value=".jsp" />

</bean>

<context:component-scan base-package="com.extremasistemas.examples.fitnessclubweb" />

dlanave@extrema-sistemas.com - Extrema Sistemas

mvc-config.xml

Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor quantità

Daniele La Nave

dlanave@extrema-sistemas.com - Extrema Sistemas

FitnessClubsController.java

Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor quantità

Daniele La Nave

<a href="http://www.server.com/fitnessclubs/members" >Lista Iscritti</a>

…la lista degli iscritti sarà quindi recuperabile come attributo della request:

${members}

dlanave@extrema-sistemas.com - Extrema Sistemas

Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor quantità

Daniele La Nave

dlanave@extrema-sistemas.com - Extrema Sistemas

FitnessClubsController.java

Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor quantità

Daniele La Nave

<forms:form action="${myurl} " method="POST" modelAttribute="customer">

<forms:input path="firstName" />

<forms:errors path="firstName" />

</forms:form>

dlanave@extrema-sistemas.com - Extrema Sistemas

memberForm.jsp

Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor quantità

Daniele La Nave

E per la sicurezza, come si fa ?

1. Si aggiunge un filtro sul web.xml

2. Si aggiunge la configurazione per la sicurezza

3. Eventualmente, si utilizza la taglib specifica di Spring per personalizzare le JSP

dlanave@extrema-sistemas.com - Extrema Sistemas

Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor quantità

Daniele La Nave

<filter>

<filter-name>springSecurityFilterChain</filter-name>

<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>

</filter>

<filter-mapping>

<filter-name>springSecurityFilterChain</filter-name>

<url-pattern>/*</url-pattern>

</filter-mapping>

dlanave@extrema-sistemas.com - Extrema Sistemas

web.xml

Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor quantità

Daniele La Nave

<security:http pattern="/css/**" security="none"/>

<security:http pattern="/login.jsp*" security="none"/>

<security:http auto-config="true" use-expressions="true">

<security:intercept-url pattern="/**" access="hasRole(' ROLE_USER')" />

<security:form-login login-page="/login"

authentication-failure-url="/login?login_error=1" />

<scecurity:logout logout-url="/logout" logout-success-url="/" invalidate-session="true" />

</security:http>

<security:authentication-manager>

<security:authentication-provider>

<security:jdbc-user-service data-source-ref="dataSource"/>

</security:authentication-provider>

</security:authentication-manager>

dlanave@extrema-sistemas.com - Extrema Sistemas

security-config.xml

Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor quantità

Daniele La Nave

<security:authorize access="hasRole('ROLE_USER')" >

…lo legge solo chi ha questa determinata authority!!

</security:authorize>

Oppure, per visualizzare i dati relativi al contesto di sicurezza:

Benvenuto: <security:authentication property="principal.username" />

dlanave@extrema-sistemas.com - Extrema Sistemas

example.jsp

Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor quantità

Daniele La Nave

“E la sicurezza è servita!”

dlanave@extrema-sistemas.com - Extrema Sistemas

Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor quantità

Daniele La Nave

“Vorrei una mail per ogni errore sul Data Access Layer”

dlanave@extrema-sistemas.com - Extrema Sistemas

Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor quantità

Daniele La Nave

Come possiamo farlo?

1. Modifichiamo tutte le repository (molto male!!!)

– Violazione del DRY Principle (Code Scattering)

– Violazione del SoC Principle (Code Tangling)

2. Aggiungiamo un componente per svolgere l’attività (Ok!)

– No Tangling

– No Scattering

dlanave@extrema-sistemas.com - Extrema Sistemas

Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor quantità

Daniele La Nave

Spring Aspect Oriented Programming

(…al volo!)

dlanave@extrema-sistemas.com - Extrema Sistemas

Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor quantità

Daniele La Nave

dlanave@extrema-sistemas.com - Extrema Sistemas

DataAccessLayerMonitor.java

Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor quantità

Daniele La Nave

<aop:aspectj-autoproxy >

<aop:include name="dataAccessMonitor" />

</ aop:aspectj-autoproxy >

<bean id="dataAccessMonitor“

class=" com.extremasistemas.examples.fitnessclub.aspects.DataAccessLayerMonitor ">

<constructor-arg ref="mailService" />

</bean>

dlanave@extrema-sistemas.com - Extrema Sistemas

aspects-config.xml

Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor quantità

Daniele La Nave

<import resource="aspects-config.xml" />

<context:component-scan base-package="com.extremasistemas.examples.fitnessclub" />

<tx:annotation-driven />

dlanave@extrema-sistemas.com - Extrema Sistemas

application-config.xml

Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor quantità

Daniele La Nave

“Fatto!!”

dlanave@extrema-sistemas.com - Extrema Sistemas

Capitolo 3

Daniele La Nave

Facciamo tutti parte di un disegno più grande. Il team, Spring ed i concetti legati

ai Design Patterns

dlanave@extrema-sistemas.com - Extrema Sistemas

Facciamo tutti parte di un disegno più grande. Il team, Spring ed concetti legati ai Design Patterns

Daniele La Nave dlanave@extrema-sistemas.com - Extrema Sistemas

La piattaforma Java propone una vasta gamma di

funzionalità per lo sviluppo delle nostre applicazioni.

Non ci fornisce, però, i mezzi per poterne organizzare gli

elementi fondamentali in un insieme che sia coerente con i

principi legati ai Design Patterns.

Sicuramente, possiamo usare i Design Patterns per la

composizione delle varie classi ed istanze di oggetti…

Facciamo tutti parte di un disegno più grande. Il team, Spring ed concetti legati ai Design Patterns

Daniele La Nave dlanave@extrema-sistemas.com - Extrema Sistemas

…Ma, dobbiamo implementarli nella nostra applicazione!

Facciamo tutti parte di un disegno più grande. Il team, Spring ed concetti legati ai Design Patterns

Daniele La Nave dlanave@extrema-sistemas.com - Extrema Sistemas

Facciamo tutti parte di un disegno più grande. Il team, Spring ed concetti legati ai Design Patterns

Daniele La Nave dlanave@extrema-sistemas.com - Extrema Sistemas

Spring ApplicationContext = Inversion of Control Pattern

Facciamo tutti parte di un disegno più grande. Il team, Spring ed concetti legati ai Design Patterns

Daniele La Nave dlanave@extrema-sistemas.com - Extrema Sistemas

Spring MVC = Front Controller Pattern

Facciamo tutti parte di un disegno più grande. Il team, Spring ed concetti legati ai Design Patterns

Daniele La Nave dlanave@extrema-sistemas.com - Extrema Sistemas

Spring AOP = Proxy Pattern

Facciamo tutti parte di un disegno più grande. Il team, Spring ed concetti legati ai Design Patterns

Daniele La Nave dlanave@extrema-sistemas.com - Extrema Sistemas

Spring JdbcTemplate = Template Method Pattern

Facciamo tutti parte di un disegno più grande. Il team, Spring ed concetti legati ai Design Patterns

Daniele La Nave dlanave@extrema-sistemas.com - Extrema Sistemas

Spring Integration = EAI Patterns

Facciamo tutti parte di un disegno più grande. Il team, Spring ed concetti legati ai Design Patterns

Daniele La Nave

“La forza scorre potente in Spring!!”

Ma…

dlanave@extrema-sistemas.com - Extrema Sistemas

Capitolo 4

Daniele La Nave

“La potenza è nulla senza controllo!”

Perché i test di unità devono essere un MUST

dlanave@extrema-sistemas.com - Extrema Sistemas

La potenza è nulla senza controllo! Perché i test di unità devono essere un MUST

Daniele La Nave

Lo Unit Testing è fondamentale perché:

• Prima troviamo un Bug, meno tempo impieghiamo nel risolverlo

• Tenere in considerazione i test, come parte integrante del progetto (TDD), consente:

• Maggiore agilità

• L’utilizzo di meccanismi di verifica automatica (es. JUnit)

dlanave@extrema-sistemas.com - Extrema Sistemas

La potenza è nulla senza controllo! Perché i test di unità devono essere un MUST

Daniele La Nave

Inoltre, cosa non da poco:

• L’implementazione dei test ci da la possibilità di controllare la “flessibilità” e la “modularità” del nostro sistema

Se non siamo in grado di implementare facilmente gli Stubs, oppure

i Mocks, per la simulazione delle dipendenze di un componente, vuol

dire che il design della nostra applicazione è da “rivedere”!

dlanave@extrema-sistemas.com - Extrema Sistemas

La potenza è nulla senza controllo! Perché i test di unità devono essere un MUST

Daniele La Nave

Spring ci offre inoltre pieno supporto

agli Integration Test:

• Permettendoci l’utilizzo dei bean nei test (tramite DI)

• Permettendoci l’uso delle transazioni per i test

• Fornendoci componenti di supporto all’esecuzione di test “out-of-container” (es. per le web application)

dlanave@extrema-sistemas.com - Extrema Sistemas

La potenza è nulla senza controllo! Perché i test di unità devono essere un MUST

Daniele La Nave

dlanave@extrema-sistemas.com - Extrema Sistemas

CustomerServiceTest.java

La potenza è nulla senza controllo! Perché i test di unità devono essere un MUST

Daniele La Nave

dlanave@extrema-sistemas.com - Extrema Sistemas

Capitolo 5

Daniele La Nave

“L’importante è vincere, non partecipare!”

Il valore aggiunto dato da Spring Framework

dlanave@extrema-sistemas.com - Extrema Sistemas

L’ importante è vincere, non partecipare! Il valore aggiunto dato da Spring Framework

Daniele La Nave

ff

dlanave@extrema-sistemas.com - Extrema Sistemas

L’ importante è vincere, non partecipare! Il valore aggiunto dato da Spring Framework

Daniele La Nave

Spring Features Overview:

• Modern Web

• Data Access

• Integration

• Mobile

• Social

• Security

• Cloud Ready

dlanave@extrema-sistemas.com - Extrema Sistemas

L’ importante è vincere, non partecipare! Il valore aggiunto dato da Spring Framework

Daniele La Nave

Spring Projects Overview:

dlanave@extrema-sistemas.com - Extrema Sistemas

Spring AMQP Spring Mobile

Spring for Android Spring.NET

Spring Batch Spring Roo

Spring Data Spring Security

Spring Framework Spring Social

Spring Gemfire Spring Web Flow

Spring Integration Spring Web Services

L’ importante è vincere, non partecipare! Il valore aggiunto dato da Spring Framework

Daniele La Nave

SpringSource ToolSuite

Features: • Wizards per Spring Projects, configurazione bean con xml

files

• Supporto per Spring 3.1

• Funzionalità avanzate per il completamento del codice, “content-assist”, validazione e supporto al “quick-fix” di applicazioni Spring

• Supporto al refactoring per la configurazione XML e @Configuration

• Editor grafico per la configurazione di Spring

• Tools visuali di sviluppo per Spring Web Flow, Spring Batch e Spring Integration

• Spring Roo project wizard con shell integrata

dlanave@extrema-sistemas.com - Extrema Sistemas

L’ importante è vincere, non partecipare! Il valore aggiunto dato da Spring Framework

Daniele La Nave

SpringSource ToolSuite

Deployment Target flessibile: • Supporto per tutti i più comuni Java EE Application

Servers

• Supporto avanzato per VMware vFabric tc Server

• Piena integrazione dell’IDE per Cloud Foundry, con inclusione del debug diretto nel cloud

dlanave@extrema-sistemas.com - Extrema Sistemas

L’ importante è vincere, non partecipare! Il valore aggiunto dato da Spring Framework

Daniele La Nave

SpringSource ToolSuite

Pronto per l’uso: • Distribuzione basata su Eclipse

• Componenti comuni già pre-installati

• Contiene le ultime versioni per i runtime di tc Server Developer Edition e Spring Roo

dlanave@extrema-sistemas.com - Extrema Sistemas

L’ importante è vincere, non partecipare! Il valore aggiunto dato da Spring Framework

Daniele La Nave

tc Server Developer & Spring Insight

dlanave@extrema-sistemas.com - Extrema Sistemas

Q&A

Daniele La Nave

Q&A

dlanave@extrema-sistemas.com - Extrema Sistemas