View
755
Download
1
Category
Tags:
Preview:
DESCRIPTION
Ovvero, come migliorare il nostro team e la nostra produttività utilizzando Spring Framework
Citation preview
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
Recommended