SlideShare uma empresa Scribd logo
1 de 100
Baixar para ler offline
Daniele La Nave
La sostenibile leggerezza di Spring!
Ovvero, come migliorare il nostro team e la nostra
produttività utilizzando Spring Framework.
dlanave@extrema-sistemas.com
Spring Certified Trainer & Specialist @ Extrema Sistemas
Capitolo 1
         Daniele La Nave   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
Come portare il nostro team, bendato e con i tappi alle orecchie,
           alla piena comprensione dell’OOP utilizzando Spring
           Daniele La Nave                  dlanave@extrema-sistemas.com - Extrema Sistemas




…..eh ?



 Perché bendato e con i tappi alle orecchie ?
Come portare il nostro team, bendato e con i tappi alle orecchie,
               alla piena comprensione dell’OOP utilizzando Spring
               Daniele La Nave                  dlanave@extrema-sistemas.com - Extrema Sistemas




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
Come portare il nostro team, bendato e con i tappi alle orecchie,
              alla piena comprensione dell’OOP utilizzando Spring
              Daniele La Nave                  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:

   “Vorrei un’ icona di color blu sul mio desktop…
   …che, se cliccata, scateni il lancio di ordigno di
   fine di mondo!!!”
Come portare il nostro team, bendato e con i tappi alle orecchie,
              alla piena comprensione dell’OOP utilizzando Spring
              Daniele La Nave                  dlanave@extrema-sistemas.com - Extrema Sistemas




Risposte:

3. “Lo voglio pronto per la prossima settimana! Anzi, lo
   voglio pronto per domani!!”
Come portare il nostro team, bendato e con i tappi alle orecchie,
              alla piena comprensione dell’OOP utilizzando Spring
              Daniele La Nave                  dlanave@extrema-sistemas.com - Extrema Sistemas




Ironia a parte, quanto descritto fin ora può causare
dei pericolosi corto-circuiti tra reparti dell’azienda:


     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                  dlanave@extrema-sistemas.com - Extrema Sistemas




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!!)
Come portare il nostro team, bendato e con i tappi alle orecchie,
                alla piena comprensione dell’OOP utilizzando Spring
                Daniele La Nave                  dlanave@extrema-sistemas.com - Extrema Sistemas




...e quindi ?



  Se i tempi sono corti ed i requisiti “complessi”,
         come possiamo far contenti tutti ?
Come portare il nostro team, bendato e con i tappi alle orecchie,
                     alla piena comprensione dell’OOP utilizzando Spring
                     Daniele La Nave                         dlanave@extrema-sistemas.com - Extrema Sistemas




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)
Come portare il nostro team, bendato e con i tappi alle orecchie,
               alla piena comprensione dell’OOP utilizzando Spring
               Daniele La Nave                  dlanave@extrema-sistemas.com - Extrema Sistemas




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
Come portare il nostro team, bendato e con i tappi alle orecchie,
                         alla piena comprensione dell’OOP utilizzando Spring
                         Daniele La Nave                         dlanave@extrema-sistemas.com - Extrema Sistemas




                                           Dependency Inversion               Interface Segregation
  Open Close Principle                          Principle                           Principle
    Classi, moduli, funzioni           I moduli a più alto livello non
dovrebbero essere “Aperte” per       dovrebbero dipendere dai moduli
                                                                              I Client non dovrebbero
 l’estensione e “Chiuse” per la        di livello più basso, entrambi              essere forzati ad
            modifica                  dovrebbero dipendere solo dalla       implementare interfacce che
                                                loro astrazione                     non utilizzano


                                                          Liskov’s Substitution
                    Single Responsibility
                                                               Principle
                          Principle
                                                          Le classi derivate devono
                   Una classe dovrebbe avere
                                                               poter sostituire
                  solo una singola ragione per
                                                          completamente quelle di
                        essere modificata
                                                                     base
Come portare il nostro team, bendato e con i tappi alle orecchie,
               alla piena comprensione dell’OOP utilizzando Spring
               Daniele La Nave                  dlanave@extrema-sistemas.com - Extrema Sistemas




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
Come portare il nostro team, bendato e con i tappi alle orecchie,
              alla piena comprensione dell’OOP utilizzando Spring
              Daniele La Nave                  dlanave@extrema-sistemas.com - Extrema Sistemas




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 ?
Come portare il nostro team, bendato e con i tappi alle orecchie,
              alla piena comprensione dell’OOP utilizzando Spring
              Daniele La Nave                  dlanave@extrema-sistemas.com - Extrema Sistemas




  La soluzione esiste, ed è apprezzata da milioni di
  sviluppatori: Spring Framework




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                  dlanave@extrema-sistemas.com - Extrema Sistemas




Principalmente, Spring ci chiede solo
di seguire alcune regole definite come
“fondamentali”:

  • DRY Principle = “Don’t Repeat Yourself”

  • SoC Principle = “Separation of Concern”

                                                                            (segue)
Come portare il nostro team, bendato e con i tappi alle orecchie,
             alla piena comprensione dell’OOP utilizzando Spring
             Daniele La Nave                  dlanave@extrema-sistemas.com - Extrema Sistemas




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!
Come portare il nostro team, bendato e con i tappi alle orecchie,
               alla piena comprensione dell’OOP utilizzando Spring
               Daniele La Nave                  dlanave@extrema-sistemas.com - Extrema Sistemas




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.
Capitolo 2
      Daniele La Nave   dlanave@extrema-sistemas.com - Extrema Sistemas




      “Fatto! …Già fatto??”
Codice più efficiente e, soprattutto,
        In minor quantità
Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor
              quantità
              Daniele La Nave                   dlanave@extrema-sistemas.com - Extrema Sistemas




Fitness Club Application


Requisiti cliente:
• Desktop App (Standalone)
  • Gestione clienti del club
  • Gestione delle sottoscrizioni alle attività
Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor
            quantità
            Daniele La Nave                    dlanave@extrema-sistemas.com - Extrema Sistemas




<<Java Class>>                <<Java Class>>            <<Java Class>>
   Member                      Subscription                Activity




            <<Java Class>>                <<Java Class>>
              Customer                       Address




                                                                Domain Objects
Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor
                quantità
                Daniele La Nave                      dlanave@extrema-sistemas.com - Extrema Sistemas




<<Java Interface>>                 <<Java Interface>>               <<Java Interface>>
MemberRepository                  SubscriptionRepository            ActivityRepository




             <<Java Interface>>                    <<Java Interface>>
             CustomerRepository                    AddressRepository




                                                                    Data Access Layer
Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor
      quantità
      Daniele La Nave                   dlanave@extrema-sistemas.com - Extrema Sistemas




  <<Java Interface>>                <<Java Interface>>
CustomerManagerService              FitnessClubService




                                                           Service Layer
Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor
      quantità
      Daniele La Nave                   dlanave@extrema-sistemas.com - Extrema Sistemas




   <<Java Class>>                      <<Java Interface>>
JdbcActivityRepository                 ActivityRepository




 <<Java Interface>>
    DataSource


                                                        Data Access Layer
                                                        (implementazione)
Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor
         quantità
         Daniele La Nave                   dlanave@extrema-sistemas.com - Extrema Sistemas




     <<Java Class>>                       <<Java Interface>>
HibernateActivityRepository               ActivityRepository




    <<Java Interface>>
      SessionFactory


                                                           Data Access Layer
                                                           (implementazione)
Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor
                   quantità
                   Daniele La Nave                   dlanave@extrema-sistemas.com - Extrema Sistemas




 <<Java Interface>>
 MemberRepository                        <<Java Class>>                  <<Java Interface>>
                                     FitnessClubServiceImpl              FitnessClubService

 <<Java Interface>>
SubscriptionRepository



               <<Java Class>>                        <<Java Interface>>
         CustomerManagerServiceImpl                CustomerManagerService



<<Java Interface>>            <<Java Interface>>
CustomerRepository            AddressRepository                        Service Layer
                                                                    (implementazione)
Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor
            quantità
            Daniele La Nave                   dlanave@extrema-sistemas.com - Extrema Sistemas




I componenti della nostra applicazione sono pronti!

    Passiamo ora alla configurazione di Spring
Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor
                        quantità
                        Daniele La Nave                   dlanave@extrema-sistemas.com - Extrema Sistemas




<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"/>

                                                                                 db-config.xml
Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor
                        quantità
                        Daniele La Nave                   dlanave@extrema-sistemas.com - Extrema Sistemas




<jdbc:embedded-database id="dataSource">
    <jdbc:script location="classpath:schema.sql"/>
    <jdbc:script location="classpath:test-data.sql"/>
</jdbc:embedded-database>




                                                                           test-db-config.xml
Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor
                      quantità
                       Daniele La Nave                   dlanave@extrema-sistemas.com - Extrema Sistemas




<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>




                                                                      hibernate-config.xml
Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor
                       quantità
                       Daniele La Nave                    dlanave@extrema-sistemas.com - Extrema Sistemas




…
<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>
…                                                                    data-access-config.xml
Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor
                       quantità
                       Daniele La Nave                   dlanave@extrema-sistemas.com - Extrema Sistemas




<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>
                                                                      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                   dlanave@extrema-sistemas.com - Extrema Sistemas




Ora che abbiamo definito la configurazione..
…”Miwa (Spring), lanciami i componenti!”
Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor
              quantità
              Daniele La Nave                   dlanave@extrema-sistemas.com - Extrema Sistemas




Ora che abbiamo definito la configurazione..
…”Miwa (Spring), lanciami i componenti!”
Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor
           quantità
           Daniele La Nave                   dlanave@extrema-sistemas.com - Extrema Sistemas




“Mmmhhhh.. ma scrivere meno XML, no eh ?”
(DI utilizzando le annotazioni ed il “component-scan”)
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                   dlanave@extrema-sistemas.com - Extrema Sistemas




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




                                                                   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                   dlanave@extrema-sistemas.com - Extrema Sistemas




“Ma questa applicazione non usa le transazioni !!”
     (Come applicare le proprietà ACID in 5 minuti)
Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor
                      quantità
                      Daniele La Nave                    dlanave@extrema-sistemas.com - Extrema Sistemas




<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>
                                                                   transaction-config.xml
Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor
                       quantità
                       Daniele La Nave                   dlanave@extrema-sistemas.com - Extrema Sistemas




Oppure, se gestito da Java EE Container:

<tx:jta-transaction-manager />




                                                                   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                   dlanave@extrema-sistemas.com - Extrema Sistemas




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

<tx:annotation-driven />




                                                                    application-config.xml
Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor
           quantità
           Daniele La Nave                   dlanave@extrema-sistemas.com - Extrema Sistemas




“Missione compiuta! Transazioni implementate!!”
Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor
              quantità
              Daniele La Nave                   dlanave@extrema-sistemas.com - Extrema Sistemas




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!
Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor
    quantità
    Daniele La Nave                   dlanave@extrema-sistemas.com - Extrema Sistemas




   Remote Method Invocation
“Senza toccare una riga di codice Java”
Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor
              quantità
              Daniele La Nave                   dlanave@extrema-sistemas.com - Extrema Sistemas




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.
Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor
                       quantità
                       Daniele La Nave                     dlanave@extrema-sistemas.com - Extrema Sistemas




<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>

                                                          application-config.xml (server)
Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor
                      quantità
                      Daniele La Nave                    dlanave@extrema-sistemas.com - Extrema Sistemas




<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>




                                                        application-config.xml (client)
Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor
           quantità
           Daniele La Nave                   dlanave@extrema-sistemas.com - Extrema Sistemas




                             Fatto!
“E non abbiamo toccato una sola riga di codice Java!!”
Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor
               quantità
               Daniele La Nave                   dlanave@extrema-sistemas.com - Extrema Sistemas




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
Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor
           quantità
           Daniele La Nave                   dlanave@extrema-sistemas.com - Extrema Sistemas




E come ?




                  Con Spring MVC!
Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor
               quantità
                Daniele La Nave                  dlanave@extrema-sistemas.com - Extrema Sistemas




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
Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor
                      quantità
                      Daniele La Nave                    dlanave@extrema-sistemas.com - Extrema Sistemas




<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>
   …


                                                                                        web.xml
Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor
                      quantità
                      Daniele La Nave                   dlanave@extrema-sistemas.com - Extrema Sistemas




…
   <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>
                                                                                     web.xml
Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor
                       quantità
                       Daniele La Nave                    dlanave@extrema-sistemas.com - Extrema Sistemas




<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" />

                                                                               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                   dlanave@extrema-sistemas.com - Extrema Sistemas




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



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

   ${members}
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                   dlanave@extrema-sistemas.com - Extrema Sistemas




<forms:form action="${myurl} " method="POST" modelAttribute="customer">
   …
   <forms:input path="firstName" />
   <forms:errors path="firstName" />
   …
</forms:form>



                                                                     memberForm.jsp
Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor
               quantità
               Daniele La Nave                   dlanave@extrema-sistemas.com - Extrema Sistemas




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
Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor
                         quantità
                         Daniele La Nave                      dlanave@extrema-sistemas.com - Extrema Sistemas




<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>




                                                                                             web.xml
Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor
                        quantità
                        Daniele La Nave                     dlanave@extrema-sistemas.com - Extrema Sistemas




<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-config.xml
</security:authentication-manager>
Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor
                        quantità
                        Daniele La Nave                    dlanave@extrema-sistemas.com - Extrema Sistemas




<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" />




                                                                                     example.jsp
Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor
quantità
Daniele La Nave                   dlanave@extrema-sistemas.com - Extrema Sistemas




 “E la sicurezza è servita!”
Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor
   quantità
   Daniele La Nave                   dlanave@extrema-sistemas.com - Extrema Sistemas




“Vorrei una mail per ogni errore
     sul Data Access Layer”
Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor
               quantità
               Daniele La Nave                   dlanave@extrema-sistemas.com - Extrema Sistemas




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
Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor
    quantità
     Daniele La Nave                  dlanave@extrema-sistemas.com - Extrema Sistemas




Spring Aspect Oriented Programming
                       (…al volo!)
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                    dlanave@extrema-sistemas.com - Extrema Sistemas




<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>


                                                                          aspects-config.xml
Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor
                       quantità
                       Daniele La Nave                   dlanave@extrema-sistemas.com - Extrema Sistemas




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

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

<tx:annotation-driven />




                                                                    application-config.xml
Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor
quantità
Daniele La Nave                   dlanave@extrema-sistemas.com - Extrema Sistemas




                  “Fatto!!”
Capitolo 3
        Daniele La Nave   dlanave@extrema-sistemas.com - Extrema Sistemas




 Facciamo tutti parte di un disegno più
grande. Il team, Spring ed i concetti legati
             ai Design Patterns
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                   dlanave@extrema-sistemas.com - Extrema Sistemas




“La forza scorre potente in Spring!!”
                Ma…
Capitolo 4
         Daniele La Nave   dlanave@extrema-sistemas.com - Extrema Sistemas




 “La potenza è nulla senza controllo!”
Perché i test di unità devono essere un MUST
La potenza è nulla senza controllo!
                Perché i test di unità devono essere un MUST
                Daniele La Nave                dlanave@extrema-sistemas.com - Extrema Sistemas




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)
La potenza è nulla senza controllo!
                 Perché i test di unità devono essere un MUST
                 Daniele La Nave                dlanave@extrema-sistemas.com - Extrema Sistemas




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”!
La potenza è nulla senza controllo!
              Perché i test di unità devono essere un MUST
              Daniele La Nave                dlanave@extrema-sistemas.com - Extrema Sistemas




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)
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   dlanave@extrema-sistemas.com - Extrema Sistemas




 “L’importante è vincere, non partecipare!”
Il valore aggiunto dato da Spring Framework
L’ importante è vincere, non partecipare!
     Il valore aggiunto dato da Spring Framework
     Daniele La Nave                dlanave@extrema-sistemas.com - Extrema Sistemas




ff
L’ importante è vincere, non partecipare!
              Il valore aggiunto dato da Spring Framework
              Daniele La Nave                dlanave@extrema-sistemas.com - Extrema Sistemas




Spring Features Overview:

•   Modern Web
•   Data Access
•   Integration
•   Mobile
•   Social
•   Security
•   Cloud Ready
L’ importante è vincere, non partecipare!
                 Il valore aggiunto dato da Spring Framework
                 Daniele La Nave                dlanave@extrema-sistemas.com - Extrema Sistemas




Spring Projects Overview:



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                  dlanave@extrema-sistemas.com - Extrema Sistemas




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
L’ importante è vincere, non partecipare!
                    Il valore aggiunto dato da Spring Framework
                    Daniele La Nave                 dlanave@extrema-sistemas.com - Extrema Sistemas




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
L’ importante è vincere, non partecipare!
                     Il valore aggiunto dato da Spring Framework
                     Daniele La Nave                  dlanave@extrema-sistemas.com - Extrema Sistemas




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
L’ importante è vincere, non partecipare!
            Il valore aggiunto dato da Spring Framework
            Daniele La Nave                dlanave@extrema-sistemas.com - Extrema Sistemas




tc Server Developer & Spring Insight
Q&A
Daniele La Nave   dlanave@extrema-sistemas.com - Extrema Sistemas




             Q&A

Mais conteúdo relacionado

Semelhante a Talk codemotion 2013 - La sostenibile leggerezza di Spring

Angelo_Bai_Curriculum
Angelo_Bai_CurriculumAngelo_Bai_Curriculum
Angelo_Bai_Curriculum
Angelo Bai
 

Semelhante a Talk codemotion 2013 - La sostenibile leggerezza di Spring (20)

Inversion of Control @ CD2008
Inversion of Control @ CD2008Inversion of Control @ CD2008
Inversion of Control @ CD2008
 
Il tuo team "agile" scrive codice "flaccido"? Forse scrum non basta
Il tuo team "agile" scrive codice "flaccido"? Forse scrum non bastaIl tuo team "agile" scrive codice "flaccido"? Forse scrum non basta
Il tuo team "agile" scrive codice "flaccido"? Forse scrum non basta
 
Manuale Agile Stelnet
Manuale Agile StelnetManuale Agile Stelnet
Manuale Agile Stelnet
 
Enterprise Applications - Angular Day 2018
Enterprise Applications - Angular Day 2018Enterprise Applications - Angular Day 2018
Enterprise Applications - Angular Day 2018
 
Strategie per applicazioni web prima o meglio dell'app nativa
Strategie per applicazioni web prima o meglio dell'app nativaStrategie per applicazioni web prima o meglio dell'app nativa
Strategie per applicazioni web prima o meglio dell'app nativa
 
Hybrid DevOps Stack
Hybrid DevOps StackHybrid DevOps Stack
Hybrid DevOps Stack
 
Software ...e tutto ciò che comporta
Software ...e tutto ciò che comportaSoftware ...e tutto ciò che comporta
Software ...e tutto ciò che comporta
 
Java Programming Language
Java Programming LanguageJava Programming Language
Java Programming Language
 
DevOps - Come diventare un buon DevOpper
DevOps -  Come diventare un buon DevOpperDevOps -  Come diventare un buon DevOpper
DevOps - Come diventare un buon DevOpper
 
EVOLUTIONBOOK: la forza di un team!
EVOLUTIONBOOK: la forza di un team!EVOLUTIONBOOK: la forza di un team!
EVOLUTIONBOOK: la forza di un team!
 
CMS OPEN - Università degli studi di Macerata (UniMC)
CMS OPEN - Università degli studi di Macerata (UniMC)CMS OPEN - Università degli studi di Macerata (UniMC)
CMS OPEN - Università degli studi di Macerata (UniMC)
 
Linux a scuola
Linux a scuolaLinux a scuola
Linux a scuola
 
"Configuration Manager: il ruolo nel ciclo di vita del software" by Omar Rossini
"Configuration Manager: il ruolo nel ciclo di vita del software" by Omar Rossini"Configuration Manager: il ruolo nel ciclo di vita del software" by Omar Rossini
"Configuration Manager: il ruolo nel ciclo di vita del software" by Omar Rossini
 
Angelo_Bai_Curriculum
Angelo_Bai_CurriculumAngelo_Bai_Curriculum
Angelo_Bai_Curriculum
 
Slides webinar Abstract "Pregi e difetti dei principali CMS Open Source"
Slides webinar Abstract "Pregi e difetti dei principali CMS Open Source" Slides webinar Abstract "Pregi e difetti dei principali CMS Open Source"
Slides webinar Abstract "Pregi e difetti dei principali CMS Open Source"
 
Wpc2019 - Distruggere DevOps, la storia di un vero team
Wpc2019 - Distruggere DevOps, la storia di un vero teamWpc2019 - Distruggere DevOps, la storia di un vero team
Wpc2019 - Distruggere DevOps, la storia di un vero team
 
Come mettere in sicurezza le applicazioni legacy, un approccio pragmatico
Come mettere in sicurezza le applicazioni legacy, un approccio pragmaticoCome mettere in sicurezza le applicazioni legacy, un approccio pragmatico
Come mettere in sicurezza le applicazioni legacy, un approccio pragmatico
 
OOP... Object Whaaat?
OOP... Object Whaaat?OOP... Object Whaaat?
OOP... Object Whaaat?
 
Flavio ATZENI - SMAU 2014
Flavio ATZENI - SMAU 2014Flavio ATZENI - SMAU 2014
Flavio ATZENI - SMAU 2014
 
Pregi e difetti dei principali CMS Open Source
Pregi e difetti dei principali CMS Open SourcePregi e difetti dei principali CMS Open Source
Pregi e difetti dei principali CMS Open Source
 

Talk codemotion 2013 - La sostenibile leggerezza di Spring

  • 1. Daniele La Nave La sostenibile leggerezza di Spring! Ovvero, come migliorare il nostro team e la nostra produttività utilizzando Spring Framework. dlanave@extrema-sistemas.com Spring Certified Trainer & Specialist @ Extrema Sistemas
  • 2. Capitolo 1 Daniele La Nave 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
  • 3. Come portare il nostro team, bendato e con i tappi alle orecchie, alla piena comprensione dell’OOP utilizzando Spring Daniele La Nave dlanave@extrema-sistemas.com - Extrema Sistemas …..eh ? Perché bendato e con i tappi alle orecchie ?
  • 4. Come portare il nostro team, bendato e con i tappi alle orecchie, alla piena comprensione dell’OOP utilizzando Spring Daniele La Nave dlanave@extrema-sistemas.com - Extrema Sistemas 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
  • 5. Come portare il nostro team, bendato e con i tappi alle orecchie, alla piena comprensione dell’OOP utilizzando Spring Daniele La Nave 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: “Vorrei un’ icona di color blu sul mio desktop… …che, se cliccata, scateni il lancio di ordigno di fine di mondo!!!”
  • 6. Come portare il nostro team, bendato e con i tappi alle orecchie, alla piena comprensione dell’OOP utilizzando Spring Daniele La Nave dlanave@extrema-sistemas.com - Extrema Sistemas Risposte: 3. “Lo voglio pronto per la prossima settimana! Anzi, lo voglio pronto per domani!!”
  • 7. Come portare il nostro team, bendato e con i tappi alle orecchie, alla piena comprensione dell’OOP utilizzando Spring Daniele La Nave dlanave@extrema-sistemas.com - Extrema Sistemas Ironia a parte, quanto descritto fin ora può causare dei pericolosi corto-circuiti tra reparti dell’azienda: Settore Commerciale Vs. Settore Sviluppo Oppure, in altri termini, una volta “rotto” il circuito “Fighetti” Vs. “Autistici”
  • 8. Come portare il nostro team, bendato e con i tappi alle orecchie, alla piena comprensione dell’OOP utilizzando Spring Daniele La Nave dlanave@extrema-sistemas.com - Extrema Sistemas 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!!)
  • 9. Come portare il nostro team, bendato e con i tappi alle orecchie, alla piena comprensione dell’OOP utilizzando Spring Daniele La Nave dlanave@extrema-sistemas.com - Extrema Sistemas ...e quindi ? Se i tempi sono corti ed i requisiti “complessi”, come possiamo far contenti tutti ?
  • 10. Come portare il nostro team, bendato e con i tappi alle orecchie, alla piena comprensione dell’OOP utilizzando Spring Daniele La Nave dlanave@extrema-sistemas.com - Extrema Sistemas 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)
  • 11. Come portare il nostro team, bendato e con i tappi alle orecchie, alla piena comprensione dell’OOP utilizzando Spring Daniele La Nave dlanave@extrema-sistemas.com - Extrema Sistemas 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
  • 12. Come portare il nostro team, bendato e con i tappi alle orecchie, alla piena comprensione dell’OOP utilizzando Spring Daniele La Nave dlanave@extrema-sistemas.com - Extrema Sistemas Dependency Inversion Interface Segregation Open Close Principle Principle Principle Classi, moduli, funzioni I moduli a più alto livello non dovrebbero essere “Aperte” per dovrebbero dipendere dai moduli I Client non dovrebbero l’estensione e “Chiuse” per la di livello più basso, entrambi essere forzati ad modifica dovrebbero dipendere solo dalla implementare interfacce che loro astrazione non utilizzano Liskov’s Substitution Single Responsibility Principle Principle Le classi derivate devono Una classe dovrebbe avere poter sostituire solo una singola ragione per completamente quelle di essere modificata base
  • 13. Come portare il nostro team, bendato e con i tappi alle orecchie, alla piena comprensione dell’OOP utilizzando Spring Daniele La Nave dlanave@extrema-sistemas.com - Extrema Sistemas 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
  • 14. Come portare il nostro team, bendato e con i tappi alle orecchie, alla piena comprensione dell’OOP utilizzando Spring Daniele La Nave dlanave@extrema-sistemas.com - Extrema Sistemas 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 ?
  • 15. Come portare il nostro team, bendato e con i tappi alle orecchie, alla piena comprensione dell’OOP utilizzando Spring Daniele La Nave dlanave@extrema-sistemas.com - Extrema Sistemas La soluzione esiste, ed è apprezzata da milioni di sviluppatori: Spring Framework Modularità Produttività Portabilità Testabilità
  • 16. Come portare il nostro team, bendato e con i tappi alle orecchie, alla piena comprensione dell’OOP utilizzando Spring Daniele La Nave dlanave@extrema-sistemas.com - Extrema Sistemas Principalmente, Spring ci chiede solo di seguire alcune regole definite come “fondamentali”: • DRY Principle = “Don’t Repeat Yourself” • SoC Principle = “Separation of Concern” (segue)
  • 17. Come portare il nostro team, bendato e con i tappi alle orecchie, alla piena comprensione dell’OOP utilizzando Spring Daniele La Nave dlanave@extrema-sistemas.com - Extrema Sistemas 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!
  • 18. Come portare il nostro team, bendato e con i tappi alle orecchie, alla piena comprensione dell’OOP utilizzando Spring Daniele La Nave dlanave@extrema-sistemas.com - Extrema Sistemas 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.
  • 19. Capitolo 2 Daniele La Nave dlanave@extrema-sistemas.com - Extrema Sistemas “Fatto! …Già fatto??” Codice più efficiente e, soprattutto, In minor quantità
  • 20. Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor quantità Daniele La Nave dlanave@extrema-sistemas.com - Extrema Sistemas Fitness Club Application Requisiti cliente: • Desktop App (Standalone) • Gestione clienti del club • Gestione delle sottoscrizioni alle attività
  • 21. Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor quantità Daniele La Nave dlanave@extrema-sistemas.com - Extrema Sistemas <<Java Class>> <<Java Class>> <<Java Class>> Member Subscription Activity <<Java Class>> <<Java Class>> Customer Address Domain Objects
  • 22. Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor quantità Daniele La Nave dlanave@extrema-sistemas.com - Extrema Sistemas <<Java Interface>> <<Java Interface>> <<Java Interface>> MemberRepository SubscriptionRepository ActivityRepository <<Java Interface>> <<Java Interface>> CustomerRepository AddressRepository Data Access Layer
  • 23. Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor quantità Daniele La Nave dlanave@extrema-sistemas.com - Extrema Sistemas <<Java Interface>> <<Java Interface>> CustomerManagerService FitnessClubService Service Layer
  • 24. Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor quantità Daniele La Nave dlanave@extrema-sistemas.com - Extrema Sistemas <<Java Class>> <<Java Interface>> JdbcActivityRepository ActivityRepository <<Java Interface>> DataSource Data Access Layer (implementazione)
  • 25. Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor quantità Daniele La Nave dlanave@extrema-sistemas.com - Extrema Sistemas <<Java Class>> <<Java Interface>> HibernateActivityRepository ActivityRepository <<Java Interface>> SessionFactory Data Access Layer (implementazione)
  • 26. Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor quantità Daniele La Nave dlanave@extrema-sistemas.com - Extrema Sistemas <<Java Interface>> MemberRepository <<Java Class>> <<Java Interface>> FitnessClubServiceImpl FitnessClubService <<Java Interface>> SubscriptionRepository <<Java Class>> <<Java Interface>> CustomerManagerServiceImpl CustomerManagerService <<Java Interface>> <<Java Interface>> CustomerRepository AddressRepository Service Layer (implementazione)
  • 27. Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor quantità Daniele La Nave dlanave@extrema-sistemas.com - Extrema Sistemas I componenti della nostra applicazione sono pronti! Passiamo ora alla configurazione di Spring
  • 28. Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor quantità Daniele La Nave dlanave@extrema-sistemas.com - Extrema Sistemas <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"/> db-config.xml
  • 29. Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor quantità Daniele La Nave dlanave@extrema-sistemas.com - Extrema Sistemas <jdbc:embedded-database id="dataSource"> <jdbc:script location="classpath:schema.sql"/> <jdbc:script location="classpath:test-data.sql"/> </jdbc:embedded-database> test-db-config.xml
  • 30. Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor quantità Daniele La Nave dlanave@extrema-sistemas.com - Extrema Sistemas <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> hibernate-config.xml
  • 31. Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor quantità Daniele La Nave dlanave@extrema-sistemas.com - Extrema Sistemas … <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> … data-access-config.xml
  • 32. Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor quantità Daniele La Nave dlanave@extrema-sistemas.com - Extrema Sistemas <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> application-config.xml
  • 33. 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
  • 34. Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor quantità Daniele La Nave dlanave@extrema-sistemas.com - Extrema Sistemas Ora che abbiamo definito la configurazione.. …”Miwa (Spring), lanciami i componenti!”
  • 35. Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor quantità Daniele La Nave dlanave@extrema-sistemas.com - Extrema Sistemas Ora che abbiamo definito la configurazione.. …”Miwa (Spring), lanciami i componenti!”
  • 36. Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor quantità Daniele La Nave dlanave@extrema-sistemas.com - Extrema Sistemas “Mmmhhhh.. ma scrivere meno XML, no eh ?” (DI utilizzando le annotazioni ed il “component-scan”)
  • 37. Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor quantità Daniele La Nave dlanave@extrema-sistemas.com - Extrema Sistemas
  • 38. Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor quantità Daniele La Nave dlanave@extrema-sistemas.com - Extrema Sistemas
  • 39. Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor quantità Daniele La Nave dlanave@extrema-sistemas.com - Extrema Sistemas <context:component-scan base-package="com.extremasistemas.examples.fitnessclub" /> application-config.xml
  • 40. Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor quantità Daniele La Nave dlanave@extrema-sistemas.com - Extrema Sistemas
  • 41. Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor quantità Daniele La Nave dlanave@extrema-sistemas.com - Extrema Sistemas “Ma questa applicazione non usa le transazioni !!” (Come applicare le proprietà ACID in 5 minuti)
  • 42. Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor quantità Daniele La Nave dlanave@extrema-sistemas.com - Extrema Sistemas <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> transaction-config.xml
  • 43. Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor quantità Daniele La Nave dlanave@extrema-sistemas.com - Extrema Sistemas Oppure, se gestito da Java EE Container: <tx:jta-transaction-manager /> transaction-config.xml
  • 44. Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor quantità Daniele La Nave dlanave@extrema-sistemas.com - Extrema Sistemas
  • 45. Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor quantità Daniele La Nave dlanave@extrema-sistemas.com - Extrema Sistemas
  • 46. Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor quantità Daniele La Nave dlanave@extrema-sistemas.com - Extrema Sistemas <context:component-scan base-package="com.extremasistemas.examples.fitnessclub" /> <tx:annotation-driven /> application-config.xml
  • 47. Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor quantità Daniele La Nave dlanave@extrema-sistemas.com - Extrema Sistemas “Missione compiuta! Transazioni implementate!!”
  • 48. Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor quantità Daniele La Nave dlanave@extrema-sistemas.com - Extrema Sistemas 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!
  • 49. Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor quantità Daniele La Nave dlanave@extrema-sistemas.com - Extrema Sistemas Remote Method Invocation “Senza toccare una riga di codice Java”
  • 50. Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor quantità Daniele La Nave dlanave@extrema-sistemas.com - Extrema Sistemas 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.
  • 51. Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor quantità Daniele La Nave dlanave@extrema-sistemas.com - Extrema Sistemas <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> application-config.xml (server)
  • 52. Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor quantità Daniele La Nave dlanave@extrema-sistemas.com - Extrema Sistemas <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> application-config.xml (client)
  • 53. Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor quantità Daniele La Nave dlanave@extrema-sistemas.com - Extrema Sistemas Fatto! “E non abbiamo toccato una sola riga di codice Java!!”
  • 54. Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor quantità Daniele La Nave dlanave@extrema-sistemas.com - Extrema Sistemas 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
  • 55. Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor quantità Daniele La Nave dlanave@extrema-sistemas.com - Extrema Sistemas E come ? Con Spring MVC!
  • 56. Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor quantità Daniele La Nave dlanave@extrema-sistemas.com - Extrema Sistemas 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
  • 57. Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor quantità Daniele La Nave dlanave@extrema-sistemas.com - Extrema Sistemas <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> … web.xml
  • 58. Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor quantità Daniele La Nave dlanave@extrema-sistemas.com - Extrema Sistemas … <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> web.xml
  • 59. Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor quantità Daniele La Nave dlanave@extrema-sistemas.com - Extrema Sistemas <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" /> mvc-config.xml
  • 60. Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor quantità Daniele La Nave dlanave@extrema-sistemas.com - Extrema Sistemas FitnessClubsController.java
  • 61. Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor quantità Daniele La Nave dlanave@extrema-sistemas.com - Extrema Sistemas <a href="http://www.server.com/fitnessclubs/members" >Lista Iscritti</a> …la lista degli iscritti sarà quindi recuperabile come attributo della request: ${members}
  • 62. Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor quantità Daniele La Nave dlanave@extrema-sistemas.com - Extrema Sistemas FitnessClubsController.java
  • 63. Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor quantità Daniele La Nave dlanave@extrema-sistemas.com - Extrema Sistemas <forms:form action="${myurl} " method="POST" modelAttribute="customer"> … <forms:input path="firstName" /> <forms:errors path="firstName" /> … </forms:form> memberForm.jsp
  • 64. Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor quantità Daniele La Nave dlanave@extrema-sistemas.com - Extrema Sistemas 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
  • 65. Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor quantità Daniele La Nave dlanave@extrema-sistemas.com - Extrema Sistemas <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> web.xml
  • 66. Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor quantità Daniele La Nave dlanave@extrema-sistemas.com - Extrema Sistemas <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-config.xml </security:authentication-manager>
  • 67. Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor quantità Daniele La Nave dlanave@extrema-sistemas.com - Extrema Sistemas <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" /> example.jsp
  • 68. Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor quantità Daniele La Nave dlanave@extrema-sistemas.com - Extrema Sistemas “E la sicurezza è servita!”
  • 69. Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor quantità Daniele La Nave dlanave@extrema-sistemas.com - Extrema Sistemas “Vorrei una mail per ogni errore sul Data Access Layer”
  • 70. Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor quantità Daniele La Nave dlanave@extrema-sistemas.com - Extrema Sistemas 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
  • 71. Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor quantità Daniele La Nave dlanave@extrema-sistemas.com - Extrema Sistemas Spring Aspect Oriented Programming (…al volo!)
  • 72. Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor quantità Daniele La Nave dlanave@extrema-sistemas.com - Extrema Sistemas DataAccessLayerMonitor.java
  • 73. Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor quantità Daniele La Nave dlanave@extrema-sistemas.com - Extrema Sistemas <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> aspects-config.xml
  • 74. Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor quantità Daniele La Nave dlanave@extrema-sistemas.com - Extrema Sistemas <import resource="aspects-config.xml" /> <context:component-scan base-package="com.extremasistemas.examples.fitnessclub" /> <tx:annotation-driven /> application-config.xml
  • 75. Fatto! Già fatto?? Codice più efficiente e, soprattutto, in minor quantità Daniele La Nave dlanave@extrema-sistemas.com - Extrema Sistemas “Fatto!!”
  • 76. Capitolo 3 Daniele La Nave dlanave@extrema-sistemas.com - Extrema Sistemas Facciamo tutti parte di un disegno più grande. Il team, Spring ed i concetti legati ai Design Patterns
  • 77. 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…
  • 78. 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!
  • 79. 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
  • 80. 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
  • 81. 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
  • 82. 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
  • 83. 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
  • 84. 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
  • 85. 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 forza scorre potente in Spring!!” Ma…
  • 86. Capitolo 4 Daniele La Nave dlanave@extrema-sistemas.com - Extrema Sistemas “La potenza è nulla senza controllo!” Perché i test di unità devono essere un MUST
  • 87. La potenza è nulla senza controllo! Perché i test di unità devono essere un MUST Daniele La Nave dlanave@extrema-sistemas.com - Extrema Sistemas 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)
  • 88. La potenza è nulla senza controllo! Perché i test di unità devono essere un MUST Daniele La Nave dlanave@extrema-sistemas.com - Extrema Sistemas 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”!
  • 89. La potenza è nulla senza controllo! Perché i test di unità devono essere un MUST Daniele La Nave dlanave@extrema-sistemas.com - Extrema Sistemas 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)
  • 90. 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
  • 91. La potenza è nulla senza controllo! Perché i test di unità devono essere un MUST Daniele La Nave dlanave@extrema-sistemas.com - Extrema Sistemas
  • 92. Capitolo 5 Daniele La Nave dlanave@extrema-sistemas.com - Extrema Sistemas “L’importante è vincere, non partecipare!” Il valore aggiunto dato da Spring Framework
  • 93. L’ importante è vincere, non partecipare! Il valore aggiunto dato da Spring Framework Daniele La Nave dlanave@extrema-sistemas.com - Extrema Sistemas ff
  • 94. L’ importante è vincere, non partecipare! Il valore aggiunto dato da Spring Framework Daniele La Nave dlanave@extrema-sistemas.com - Extrema Sistemas Spring Features Overview: • Modern Web • Data Access • Integration • Mobile • Social • Security • Cloud Ready
  • 95. L’ importante è vincere, non partecipare! Il valore aggiunto dato da Spring Framework Daniele La Nave dlanave@extrema-sistemas.com - Extrema Sistemas Spring Projects Overview: 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
  • 96. L’ importante è vincere, non partecipare! Il valore aggiunto dato da Spring Framework Daniele La Nave dlanave@extrema-sistemas.com - Extrema Sistemas 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
  • 97. L’ importante è vincere, non partecipare! Il valore aggiunto dato da Spring Framework Daniele La Nave dlanave@extrema-sistemas.com - Extrema Sistemas 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
  • 98. L’ importante è vincere, non partecipare! Il valore aggiunto dato da Spring Framework Daniele La Nave dlanave@extrema-sistemas.com - Extrema Sistemas 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
  • 99. L’ importante è vincere, non partecipare! Il valore aggiunto dato da Spring Framework Daniele La Nave dlanave@extrema-sistemas.com - Extrema Sistemas tc Server Developer & Spring Insight
  • 100. Q&A Daniele La Nave dlanave@extrema-sistemas.com - Extrema Sistemas Q&A