SlideShare a Scribd company logo
1 of 45
Download to read offline
Spring 3.0
                                       What‘s new




Massimiliano Dessì, Pronetics S.p.A.                1
Speaker
Software Engineer and Architect                      ProNetics
Founder                               Spring Italian User Group
Presidente                                 JugSardegna Onlus
Committer/Contributor                   OpenNMS – MongoDB
Autore             Spring 2.5 Aspect Oriented programming




Massimiliano Dessì, Pronetics S.p.a                         2
Agenda


                  - Allineamento codice con Java 5
                     - Java based bean metadata
                         - Expression Language
                                  - OXM
                                 - REST
                         - Declarative Validation
                         - Embedded Database


Massimiliano Dessì, Pronetics S.p.a                  3
Allineamento codice Java 5


                     Core API allineate con Java 5
                     recupero di bean senza cast:

      T getBean(String name, Class<T>
               requiredType)

           Map<String, T> getBeansOfType
                  (Class<T> type)

Massimiliano Dessì, Pronetics S.p.a                          4
ApplicationContext
<?xml version="1.0" encoding="UTF-8"?>
…
    <bean id="uno" class="it.jax.italia.Uno”>
     <constructor-arg index="0” value="pippo"/>
    </bean>


    <bean id="due" class="it.jax.italia.Due" p:nome="Pluto"/>


</beans>




     Massimiliano Dessì, Pronetics S.p.a                        5
Recupero bean

ClassPathXmlApplicationContext ctx = new
  ClassPathXmlApplicationContext(”beans.xml");


 Uno one = ctx.getBean("uno", Uno.class);


 Map<String,Due> beans = ctx.getBeansOfType(Due.class);




   Massimiliano Dessì, Pronetics S.p.a             6
ApplicationEvent
    public class MyPublisher implements ApplicationEventPublisherAware {

       private ApplicationEventPublisher pub;

       public void setApplicationEventPublisher(
                       ApplicationEventPublisher publisher) {
           pub = publisher;
       }

       public void execute(){
           Evento event = new Evento(this, "Hello from mars !");
           pub.publishEvent(event);
       }
}




       Massimiliano Dessì, Pronetics S.p.a                          7
ApplicationListener

    Ora possiamo ricevere gli eventi del tipo che ci interessa anzichè
                      dover utilizzare l’instanceof per discriminare


public class EventoListener implements ApplicationListener<Evento> {

    public void onApplicationEvent(Evento event) {
        ..
    }

}




    Massimiliano Dessì, Pronetics S.p.a                                8
Java based bean metadata
Ora è possibile configurare l’applicationContext tramite codice Java
 @Configuration
 public class Config {

     private @Value("#{configProperties.url}") String url;

     @Bean(name="tre")
     public Tre treService() {
         return new Tre(url);
     }

     @Bean(name="quattro")
     public Quattro quattroService(){
         return new Quattro(treService());
     }
 }


     Massimiliano Dessì, Pronetics S.p.a                           9
Java based bean metadata
                 Comunichiamo quale classe contiene la configurazione
                                         e l’eventuale properties file.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:util="http://www.springframework.org/schema/util"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">

 <context:component-scan base-package="it.jax.bean.metadata"/>
 <util:properties id="configProperties"
                  location="classpath:it/jax/italia/bean/metadata/config.properties"/>

</beans>

   Massimiliano Dessì, Pronetics S.p.a                                            10
SpEL
                              Spring Expression Language

        Si tratta di un linguaggio molto espressivo che supporta

    l'interrogazione e la modifica di un grafo di oggetti a runtime,

 utilizzabile nella configurazione xml, nelle annotazioni nelle firme

      dei metodi, e questo in tutti I prodotti dello Spring Portfolio




Massimiliano Dessì, Pronetics S.p.a                                     11
SpEL

              #{T(java.util.Calendar).getInstance()}

                          #{T(Integer).toString(675)}

#{T(String).CASE_INSENSITIVE_ORDER.compare(“d”,”D”)}

           #{new java.io.File(‘/tmp/work’).mkdir()}




  Massimiliano Dessì, Pronetics S.p.a                     12
SpEL
                                      Collections
                                       Proiezioni

       <collection‐name>.![collection‐expression]



                                        Selezioni

       <collection‐name>.?[collection‐expression]




Massimiliano Dessì, Pronetics S.p.a                   13
SpEL
                            Variabili implicite globali
                                      systemProperties
                                      systemEnvironment


                     Variabili implicite runtime Web
                             servletContext
           contextProperties – Web application init parameters
               contextAttributes – attributi Servlet context
                                Request
                                Session
                              servletConfig
Massimiliano Dessì, Pronetics S.p.a                              14
SpEL

                Variabili implicite runtime Web JSF
                               Request/session/application
                                     requestScope
                                     sessionScope
                                applicationScopecookie
                                 header/headerValues
                                  param/paramValues
                                        initParam
                                           view
                                      facesContext


Massimiliano Dessì, Pronetics S.p.a                            15
SpEL

                                      Operatori
                         == != < > <= >= instanceof

                                       and or !

                                      + ‐*/%^

                   <expression>? If‐true‐result : if‐false‐result

                <expression>?: if‐null‐result (Elvis with default)




Massimiliano Dessì, Pronetics S.p.a                                    16
SpEL XML
                            Utilizzabile nella configurazione XML
                              dove posso anche riferirli tra loro


<bean id="numberGuess" class="org.spring.samples.NumberGuess"

      p:randomNumber="#{ T(java.lang.Math).random() * 100.0 }"/>


<bean id="shapeGuess" class="org.spring.samples.ShapeGuess"

      p:initialShapeSeed="#{ numberGuess.randomNumber }"/>




   Massimiliano Dessì, Pronetics S.p.a                                   17
SpEL nel codice
private MovieFinder movieFinder;
private String defaultLocale;



@Value("#{ systemProperties['user.region'] }")

public void setDefaultLocale(String defaultLocale){

    this.defaultLocale = defaultLocale;

}



@Autowired

public void configure(MovieFinder movieFinder,

         @Value("#{ systemProperties['user.region'] } String defaultLocale){

    this.movieFinder = movieFinder;

    this.defaultLocale = defaultLocale;

}
Massimiliano Dessì, Pronetics S.p.a                                    18
SpEL Security

@PreAuthorize("hasRole('ROLE_SUPERVISOR') or " +
"hasRole('ROLE_TELLER') and " +
"(#account.balance + #amount >= -#account.overdraft)" )
public void post(Account account, double amount);




  Massimiliano Dessì, Pronetics S.p.a                     19
Object XML Mapping
                     In Spring 3.0 è stato creato il package
                  org.springframework.oxm dove troviamo

public interface Marshaller {
/**
* Marshals the object graph with the given root into
 the provided Result.
*/
void marshal(Object graph, Result result)
     throws XmlMappingException, IOException;
}




  Massimiliano Dessì, Pronetics S.p.a                          20
Object XML Mapping
                                        e l’ unmarshall

public interface Unmarshaller {
/**
* Unmarshals the given provided Source into an object
 graph.
*/
Object unmarshal(Source source)
    throws XmlMappingException, IOException;
}




  Massimiliano Dessì, Pronetics S.p.a                         21
Object XML Mapping

                        Viene fornita l’implementazione con:


                                       JAXB 2
                                       Castor
                                      XMLBeans
                                        JiBX
                                       XStream




Massimiliano Dessì, Pronetics S.p.a                            22
Object XML Mapping
          Per utilizzare JAXB2 si utilizza nella configurazione XML
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance
xmlns:oxm=http://www.springframework.org/schema/oxm
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/oxm
http://www.springframework.org/schema/oxm/spring-oxm-3.0.xsd">


<oxm:jaxb2-marshaller id="marshaller">
   <oxm:class-to-be-bound name="org.samples.airline.schema.Airport"/>
   <oxm:class-to-be-bound name="org.samples.airline.schema.Flight"/>
</oxm:jaxb2-marshaller>

<oxm:jaxb2-marshaller id="marshaller"
 contextPath="org.springframework.ws.samples.airline.schema"/>



  Massimiliano Dessì, Pronetics S.p.a                                   23
Object XML Mapping
        Per utilizzare CASTOR si utilizza nella configurazione XML

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance
xmlns:oxm=http://www.springframework.org/schema/oxm
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/oxm
http://www.springframework.org/schema/oxm/spring-oxm-3.0.xsd">

<bean id="castorMarshaller
  class="org.springframework.oxm.castor.CastorMarshaller"

  p:mappingLocation="classpath:mapping.xml" />




   Massimiliano Dessì, Pronetics S.p.a                            24
Object XML Mapping
        Per utilizzare XMLBeans si utilizza nella configurazione XML

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance
xmlns:oxm=http://www.springframework.org/schema/oxm
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/oxm
http://www.springframework.org/schema/oxm/spring-oxm-3.0.xsd">

<oxm:xmlbeans-marshaller id="marshaller"/>




   Massimiliano Dessì, Pronetics S.p.a                            25
Object XML Mapping
             Per utilizzare JiBX si utilizza nella configurazione XML

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance
xmlns:oxm=http://www.springframework.org/schema/oxm
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/oxm
http://www.springframework.org/schema/oxm/spring-oxm-3.0.xsd">

<oxm:jibx-marshaller id="marshaller"
  target-class="org.springframework.ws.samples.airline.schema.Flight"/>




   Massimiliano Dessì, Pronetics S.p.a                                  26
Object XML Mapping
        Per utilizzare XSTREAM si utilizza nella configurazione XML

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance
xmlns:oxm=http://www.springframework.org/schema/oxm
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/oxm
http://www.springframework.org/schema/oxm/spring-oxm-3.0.xsd">

<bean id="xstreamMarshaller"
  class="org.springframework.oxm.xstream.XStreamMarshaller">
  <property name="aliases">
   <props>
       <prop key="Flight">org.springframework.oxm.xstream.Flight</prop>
   </props>
  </property>
</bean>

   Massimiliano Dessì, Pronetics S.p.a                                    27
Date Time support
public class AnnotationDrivenDateTimeFormattingShowcase {

 // by default, printed & parsed using localized short datetime format (no
 annotation required) e.g. Locale.US=mm/dd/yyyy h:mm:ss a
 private Date dateField;

 // printed & parsed using localized short date format e.g. Locale.US=mm/dd/yyyy
 @DateTimeFormat(dateStyle = Style.SHORT)
 private Date shortDateField;

 // printed & parsed using localized short time format e.g Locale.US=h:mm:ss a
 @DateTimeFormat(timeStyle = Style.SHORT)
 private Date shortTimeField;

 // printed & parsed using custom datetime pattern
 @DateTimeFormat(pattern = "yyyy/mm/dd")
 private Date dateFieldCustomPattern;




   Massimiliano Dessì, Pronetics S.p.a                                 28
Date Time support
// by default, printed & parsed using localized short datetime format (no
annotation required) e.g. Locale.US=mm/dd/yyyy h:mm:ss a
private DateTime jodaDateField;

// printed & parsed using localized short date format e.g. Locale.US=mm/dd/yyyy
@DateTimeFormat(dateStyle = Style.SHORT)
private DateTime shortJodaDateField;

// printed & parsed using default ISO date time format yyyy-mm-ddThh:mm:ss.SSSZ
@ISODateTimeFormat
private Date isoDateField;

// by default, printed & parsed using localized short datetime format (no
annotaiton required) e.g. Locale.US=mm/dd/yyyy h:mm:ss a
private Calendar calendar;

// printed & parsed using localized short date format e.g. Locale.US=mm/dd/yyyy
@DateTimeFormat(dateStyle = Style.SHORT)
private Calendar shortCalendar;


  Massimiliano Dessì, Pronetics S.p.a                                 29
Date Time support

// printed & parsed using short datetime format e.g. Locale.US=mm/dd/yyyy h:mm:ss
   @DateTimeFormat(dateStyle = Style.SHORT, timeStyle=Style.SHORT)
   private Long millis;

    /* @Controller method using @DateTimeFormat annotation on method param to
    specify format of 'dateParam' request parameter*/
    @RequestMapping
    public void handlerMethod(@RequestParam @DateTimeFormat(dateStyle =
    Style.SHORT) Date dateParam) {

    }
}




        Massimiliano Dessì, Pronetics S.p.a                               30
MVC namespace
                                         Spring 3.0 RC2


<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns=http://www.springframework.org/schema/beans
xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance
xmlns:mvc=http://www.springframework.org/schema/mvc
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">

 <!-- Turns on support for mapping requests to Spring MVC @Controller methods
      Also registers default Formatters and Validators for use across all
 @Controllers -->

       <mvc:annotated-controllers />

</beans>

   Massimiliano Dessì, Pronetics S.p.a                                 31
MVC namespace
                      <mvc:annotated-controllers /> indica
                           l’abilitazione dei seguenti bean

<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"
   p:order=1/>



 <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
   <property name="webBindingInitializer">
      <bean class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer">
              <property name="conversionService" ref="conversionService" />
              <property name="validator" ref="validator" />
      </bean>
    </property>
 </bean>

 <bean id="conversionService"
   class="org.springframework.samples.petclinic.util.PetclinicConversionServiceFactory" />

 <bean id="validator"
   class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean" />

     Massimiliano Dessì, Pronetics S.p.a                                            32
REST


                  •  Uri Template support (Client e Controller)

•  Rappresentazione HTML, XML, RSS, Atom, PDF, Excel, JSON

                 •  Filtro servlet per il supporto PUT/DELETE

                                •  Costruito su SpringMVC




Massimiliano Dessì, Pronetics S.p.a                                 33
REST
                         Possiamo utilizzare delle mappature
                                      Rest style:


@RequestMapping(value = "/articles/{id}", method = RequestMethod.GET)
public ModelAndView getArticle(@PathVariable("id") String id) {
          return new ModelAndView("articleView", "article",
                                    articleFacade.getArticle(id));
}


                E avere content negotiation nel view resolver




Massimiliano Dessì, Pronetics S.p.a                               34
REST
                            Accedere ai cookie e agli header della request
                                            attraverso le annotazioni


@RequestMapping("/show")
    public ModelAndView getInfo(@RequestHeader("region") long regionId,
     @CookieValue("language") String langId) {
    ...
}




          Massimiliano Dessì, Pronetics S.p.a                                35
REST
Sopratutto abbiamo un RESTTemplate che come glialtriSpringtemplate
                               semplifica le chiamate REST
               HTTP                     RestTemplate
               DELETE                   delete(String, String...)
               GET                      getForObject(String, Class, String...)
               HEAD                     headForHeaders(String, String...)
               OPTIONS                  optionsForAllow(String, String...)
               POST                     postForLocation(String, Object, String)
               PUT                      put(String, Object, String...)



 Massimiliano Dessì, Pronetics S.p.a                                         36
REST
             Gli oggetti da e per i metodi del RestTemplate passano
                attraverso messageconverters per essere convertiti.

                     ByteArrayHttpMessageConverter
                     StringHttpMessageConverter
                     FormHttpMessageConverter
                     SourceHttpMessageConverter
                     MarshallingHttpMessageConverter
                     BufferedImageHttpMessageConverter

Il RestTemplate ci permette quindi di fare chiamate da e verso servizi
REST in modo semplificato.



 Massimiliano Dessì, Pronetics S.p.a                              37
REST
     Se abbiamo un controller che ha un mappatura di questo tipo:


@Controller
public class RestController {

    @RequestMapping(value= "/books/{book}/{pg}”,method = RequestMethod.GET)
    public String getArticle(@PathVariable("book") String book,
                         @PathVariable("pg") String pg){
    …
}




      Massimiliano Dessì, Pronetics S.p.a                           38
REST
                     Possiamo interrogare il controller precedente
                                 attraverso il RestTemplate


   RestTemplate restTemplate = new RestTemplate();
   Map<String,String> vars = new HashMap<String,String>();
   vars.put("book", "sandokan");
   vars.put("pg", "21");
   String uri = "http://example.com/books/{book}/{pg}";
   String result = restTemplate.getForObject(uri,
                                         String.class, vars);




Massimiliano Dessì, Pronetics S.p.a                                  39
Validazione dichiarativa
                                          Nelle classi
import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;

public class MyBean {

      @NotNull
      @Max(64)
      private String name;

      @Min(0)
      private int age;
}



    Massimiliano Dessì, Pronetics S.p.a                        40
Validazione dichiarativa
                                   Configuriamo un JSR 303 validator
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
   <property name="webBindingInitializer”>
        <bean class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer">
             <property name="validator" ref="validator" />
        </bean>
   </property>
</bean>

<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean" />




    Possiamo così usare l’annotazione @Valid nei metodi dei Controller


     @RequestMapping("/foo", method=RequestMethod.POST)
    public void processFoo(@Valid Foo foo) { ... }




      Massimiliano Dessì, Pronetics S.p.a                                                             41
Database embedded

                                Supporto per H2, Derby, HSQL
                                         Nella configurazione


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




   Massimiliano Dessì, Pronetics S.p.a                           42
Database embedded

                         Utile soprattutto per l’ utilizzo nei test


EmbeddedDatabaseBuilder builder = new EmbeddedDatabaseBuilder();
EmbeddedDatabase db = builder.type(EmbeddedDatabaseType.H2).
                 script("schema.sql").script("test-data.sql").build();


// do stuff against the db (EmbeddedDatabase extends
javax.sql.DataSource)


db.shutdown();



 Massimiliano Dessì, Pronetics S.p.a                                  43
Database embedded




        Domande ?




Massimiliano Dessì, Pronetics S.p.a                 44
Grazie per l’attenzione !
                            Massimiliano Dessì
                           desmax74 at yahoo.it
                      massimiliano.dessi at pronetics.it

                                    http://twitter.com/desmax74
                                     http://jroller.com/desmax
                              http://www.linkedin.com/in/desmax74
                    http://wiki.java.net/bin/view/People/MassimilianoDessi
               http://www.jugsardegna.org/vqwiki/jsp/Wiki?MassimilianoDessi

                               Spring Framework Italian User Group
                     http://it.groups.yahoo.com/group/SpringFramework-it



Massimiliano Dessì, Pronetics S.p.a                                           45

More Related Content

Viewers also liked

Was 5.1 To 6.1 Updated
Was 5.1 To 6.1 UpdatedWas 5.1 To 6.1 Updated
Was 5.1 To 6.1 Updatedtsmanyam
 
FRG CRM - Gestão de Clientes
FRG CRM - Gestão de ClientesFRG CRM - Gestão de Clientes
FRG CRM - Gestão de ClientesFelipe Borges
 
Form emp-i-ing-unidad1-parte 1-junio-18-2011
Form emp-i-ing-unidad1-parte 1-junio-18-2011Form emp-i-ing-unidad1-parte 1-junio-18-2011
Form emp-i-ing-unidad1-parte 1-junio-18-2011doritamiryam
 
Cliping CATRJ AI 2 Inauguração - Junho 2010
Cliping CATRJ AI 2 Inauguração - Junho 2010Cliping CATRJ AI 2 Inauguração - Junho 2010
Cliping CATRJ AI 2 Inauguração - Junho 2010Beatriz Diniz
 

Viewers also liked (6)

Was 5.1 To 6.1 Updated
Was 5.1 To 6.1 UpdatedWas 5.1 To 6.1 Updated
Was 5.1 To 6.1 Updated
 
3
33
3
 
FRG CRM - Gestão de Clientes
FRG CRM - Gestão de ClientesFRG CRM - Gestão de Clientes
FRG CRM - Gestão de Clientes
 
Form emp-i-ing-unidad1-parte 1-junio-18-2011
Form emp-i-ing-unidad1-parte 1-junio-18-2011Form emp-i-ing-unidad1-parte 1-junio-18-2011
Form emp-i-ing-unidad1-parte 1-junio-18-2011
 
Cliping CATRJ AI 2 Inauguração - Junho 2010
Cliping CATRJ AI 2 Inauguração - Junho 2010Cliping CATRJ AI 2 Inauguração - Junho 2010
Cliping CATRJ AI 2 Inauguração - Junho 2010
 
Uml basics
Uml basicsUml basics
Uml basics
 

Similar to Spring3.0 JaxItalia09

Jaxitalia09 Spring Best Practices
Jaxitalia09 Spring Best PracticesJaxitalia09 Spring Best Practices
Jaxitalia09 Spring Best PracticesMassimiliano Dessì
 
A brief overview of java frameworks
A brief overview of java frameworksA brief overview of java frameworks
A brief overview of java frameworksMD Sayem Ahmed
 
Pure Java RAD and Scaffolding Tools Race
Pure Java RAD and Scaffolding Tools RacePure Java RAD and Scaffolding Tools Race
Pure Java RAD and Scaffolding Tools RaceBaruch Sadogursky
 
RESTful API In Node Js using Express
RESTful API In Node Js using Express RESTful API In Node Js using Express
RESTful API In Node Js using Express Jeetendra singh
 
Let's play with adf 3.0
Let's play with adf 3.0Let's play with adf 3.0
Let's play with adf 3.0Eugenio Romano
 
Spring dependency injection
Spring dependency injectionSpring dependency injection
Spring dependency injectionsrmelody
 
beyond tellerrand: Mobile Apps with JavaScript – There's More Than Web
beyond tellerrand: Mobile Apps with JavaScript – There's More Than Webbeyond tellerrand: Mobile Apps with JavaScript – There's More Than Web
beyond tellerrand: Mobile Apps with JavaScript – There's More Than WebHeiko Behrens
 
Introduction to Ecmascript - ES6
Introduction to Ecmascript - ES6Introduction to Ecmascript - ES6
Introduction to Ecmascript - ES6Nilesh Jayanandana
 
Introduction to spaCy
Introduction to spaCyIntroduction to spaCy
Introduction to spaCyRyo Takahashi
 
Programmability in spss 14
Programmability in spss 14Programmability in spss 14
Programmability in spss 14Armand Ruis
 
Neo4j Stored Procedure Training Part 1
Neo4j Stored Procedure Training Part 1Neo4j Stored Procedure Training Part 1
Neo4j Stored Procedure Training Part 1Max De Marzi
 
Spock Framework - Slidecast
Spock Framework - SlidecastSpock Framework - Slidecast
Spock Framework - SlidecastDaniel Kolman
 
A few good JavaScript development tools
A few good JavaScript development toolsA few good JavaScript development tools
A few good JavaScript development toolsSimon Kim
 

Similar to Spring3.0 JaxItalia09 (20)

Jaxitalia09 Spring Best Practices
Jaxitalia09 Spring Best PracticesJaxitalia09 Spring Best Practices
Jaxitalia09 Spring Best Practices
 
A brief overview of java frameworks
A brief overview of java frameworksA brief overview of java frameworks
A brief overview of java frameworks
 
Os Haase
Os HaaseOs Haase
Os Haase
 
Pure Java RAD and Scaffolding Tools Race
Pure Java RAD and Scaffolding Tools RacePure Java RAD and Scaffolding Tools Race
Pure Java RAD and Scaffolding Tools Race
 
Play framework
Play frameworkPlay framework
Play framework
 
RESTful API In Node Js using Express
RESTful API In Node Js using Express RESTful API In Node Js using Express
RESTful API In Node Js using Express
 
Let's play with adf 3.0
Let's play with adf 3.0Let's play with adf 3.0
Let's play with adf 3.0
 
Modern Java Development
Modern Java DevelopmentModern Java Development
Modern Java Development
 
ExSchema
ExSchemaExSchema
ExSchema
 
Spring dependency injection
Spring dependency injectionSpring dependency injection
Spring dependency injection
 
beyond tellerrand: Mobile Apps with JavaScript – There's More Than Web
beyond tellerrand: Mobile Apps with JavaScript – There's More Than Webbeyond tellerrand: Mobile Apps with JavaScript – There's More Than Web
beyond tellerrand: Mobile Apps with JavaScript – There's More Than Web
 
Introduction to Ecmascript - ES6
Introduction to Ecmascript - ES6Introduction to Ecmascript - ES6
Introduction to Ecmascript - ES6
 
JavaFX Pitfalls
JavaFX PitfallsJavaFX Pitfalls
JavaFX Pitfalls
 
Introduction to spaCy
Introduction to spaCyIntroduction to spaCy
Introduction to spaCy
 
Programmability in spss 14
Programmability in spss 14Programmability in spss 14
Programmability in spss 14
 
Neo4j Stored Procedure Training Part 1
Neo4j Stored Procedure Training Part 1Neo4j Stored Procedure Training Part 1
Neo4j Stored Procedure Training Part 1
 
Backbone js
Backbone jsBackbone js
Backbone js
 
Spock Framework
Spock FrameworkSpock Framework
Spock Framework
 
Spock Framework - Slidecast
Spock Framework - SlidecastSpock Framework - Slidecast
Spock Framework - Slidecast
 
A few good JavaScript development tools
A few good JavaScript development toolsA few good JavaScript development tools
A few good JavaScript development tools
 

More from Massimiliano Dessì

When Old Meets New: Turning Maven into a High Scalable, Resource Efficient, C...
When Old Meets New: Turning Maven into a High Scalable, Resource Efficient, C...When Old Meets New: Turning Maven into a High Scalable, Resource Efficient, C...
When Old Meets New: Turning Maven into a High Scalable, Resource Efficient, C...Massimiliano Dessì
 
Microservices in Go_Dessi_Massimiliano_Codemotion_2017_Rome
Microservices in Go_Dessi_Massimiliano_Codemotion_2017_Rome Microservices in Go_Dessi_Massimiliano_Codemotion_2017_Rome
Microservices in Go_Dessi_Massimiliano_Codemotion_2017_Rome Massimiliano Dessì
 
Dessi docker kubernetes paas cloud
Dessi docker kubernetes paas cloudDessi docker kubernetes paas cloud
Dessi docker kubernetes paas cloudMassimiliano Dessì
 
Web Marketing Training 2014 Community Online
Web Marketing Training 2014 Community OnlineWeb Marketing Training 2014 Community Online
Web Marketing Training 2014 Community OnlineMassimiliano Dessì
 
Vert.X like Node.js but polyglot and reactive on JVM
Vert.X like Node.js but polyglot and reactive on JVMVert.X like Node.js but polyglot and reactive on JVM
Vert.X like Node.js but polyglot and reactive on JVMMassimiliano Dessì
 
Reactive applications Linux Day 2013
Reactive applications Linux Day 2013Reactive applications Linux Day 2013
Reactive applications Linux Day 2013Massimiliano Dessì
 
Scala Italy 2013 extended Scalatra vs Spring MVC
Scala Italy 2013 extended Scalatra vs Spring MVCScala Italy 2013 extended Scalatra vs Spring MVC
Scala Italy 2013 extended Scalatra vs Spring MVCMassimiliano Dessì
 
Codemotion 2013 scalatra_play_spray
Codemotion 2013 scalatra_play_sprayCodemotion 2013 scalatra_play_spray
Codemotion 2013 scalatra_play_sprayMassimiliano Dessì
 
Why we cannot ignore functional programming
Why we cannot ignore functional programmingWhy we cannot ignore functional programming
Why we cannot ignore functional programmingMassimiliano Dessì
 
Three languages in thirty minutes
Three languages in thirty minutesThree languages in thirty minutes
Three languages in thirty minutesMassimiliano Dessì
 

More from Massimiliano Dessì (20)

Code One 2018 maven
Code One 2018   mavenCode One 2018   maven
Code One 2018 maven
 
When Old Meets New: Turning Maven into a High Scalable, Resource Efficient, C...
When Old Meets New: Turning Maven into a High Scalable, Resource Efficient, C...When Old Meets New: Turning Maven into a High Scalable, Resource Efficient, C...
When Old Meets New: Turning Maven into a High Scalable, Resource Efficient, C...
 
Hacking Maven Linux day 2017
Hacking Maven Linux day 2017Hacking Maven Linux day 2017
Hacking Maven Linux day 2017
 
Microservices in Go_Dessi_Massimiliano_Codemotion_2017_Rome
Microservices in Go_Dessi_Massimiliano_Codemotion_2017_Rome Microservices in Go_Dessi_Massimiliano_Codemotion_2017_Rome
Microservices in Go_Dessi_Massimiliano_Codemotion_2017_Rome
 
Dessi docker kubernetes paas cloud
Dessi docker kubernetes paas cloudDessi docker kubernetes paas cloud
Dessi docker kubernetes paas cloud
 
Docker dDessi november 2015
Docker dDessi november 2015Docker dDessi november 2015
Docker dDessi november 2015
 
Docker linuxday 2015
Docker linuxday 2015Docker linuxday 2015
Docker linuxday 2015
 
Openshift linuxday 2014
Openshift linuxday 2014Openshift linuxday 2014
Openshift linuxday 2014
 
Web Marketing Training 2014 Community Online
Web Marketing Training 2014 Community OnlineWeb Marketing Training 2014 Community Online
Web Marketing Training 2014 Community Online
 
Vert.X like Node.js but polyglot and reactive on JVM
Vert.X like Node.js but polyglot and reactive on JVMVert.X like Node.js but polyglot and reactive on JVM
Vert.X like Node.js but polyglot and reactive on JVM
 
Reactive applications Linux Day 2013
Reactive applications Linux Day 2013Reactive applications Linux Day 2013
Reactive applications Linux Day 2013
 
Scala Italy 2013 extended Scalatra vs Spring MVC
Scala Italy 2013 extended Scalatra vs Spring MVCScala Italy 2013 extended Scalatra vs Spring MVC
Scala Italy 2013 extended Scalatra vs Spring MVC
 
Codemotion 2013 scalatra_play_spray
Codemotion 2013 scalatra_play_sprayCodemotion 2013 scalatra_play_spray
Codemotion 2013 scalatra_play_spray
 
Why we cannot ignore functional programming
Why we cannot ignore functional programmingWhy we cannot ignore functional programming
Why we cannot ignore functional programming
 
Scala linux day 2012
Scala linux day 2012 Scala linux day 2012
Scala linux day 2012
 
Three languages in thirty minutes
Three languages in thirty minutesThree languages in thirty minutes
Three languages in thirty minutes
 
MongoDB dessi-codemotion
MongoDB dessi-codemotionMongoDB dessi-codemotion
MongoDB dessi-codemotion
 
MongoDB Webtech conference 2010
MongoDB Webtech conference 2010MongoDB Webtech conference 2010
MongoDB Webtech conference 2010
 
RESTEasy
RESTEasyRESTEasy
RESTEasy
 
Spring Roo Internals Javaday IV
Spring Roo Internals Javaday IVSpring Roo Internals Javaday IV
Spring Roo Internals Javaday IV
 

Recently uploaded

OpenShift Commons Paris - Choose Your Own Observability Adventure
OpenShift Commons Paris - Choose Your Own Observability AdventureOpenShift Commons Paris - Choose Your Own Observability Adventure
OpenShift Commons Paris - Choose Your Own Observability AdventureEric D. Schabell
 
Bird eye's view on Camunda open source ecosystem
Bird eye's view on Camunda open source ecosystemBird eye's view on Camunda open source ecosystem
Bird eye's view on Camunda open source ecosystemAsko Soukka
 
Salesforce Miami User Group Event - 1st Quarter 2024
Salesforce Miami User Group Event - 1st Quarter 2024Salesforce Miami User Group Event - 1st Quarter 2024
Salesforce Miami User Group Event - 1st Quarter 2024SkyPlanner
 
GenAI and AI GCC State of AI_Object Automation Inc
GenAI and AI GCC State of AI_Object Automation IncGenAI and AI GCC State of AI_Object Automation Inc
GenAI and AI GCC State of AI_Object Automation IncObject Automation
 
Machine Learning Model Validation (Aijun Zhang 2024).pdf
Machine Learning Model Validation (Aijun Zhang 2024).pdfMachine Learning Model Validation (Aijun Zhang 2024).pdf
Machine Learning Model Validation (Aijun Zhang 2024).pdfAijun Zhang
 
KubeConEU24-Monitoring Kubernetes and Cloud Spend with OpenCost
KubeConEU24-Monitoring Kubernetes and Cloud Spend with OpenCostKubeConEU24-Monitoring Kubernetes and Cloud Spend with OpenCost
KubeConEU24-Monitoring Kubernetes and Cloud Spend with OpenCostMatt Ray
 
Introduction to Matsuo Laboratory (ENG).pptx
Introduction to Matsuo Laboratory (ENG).pptxIntroduction to Matsuo Laboratory (ENG).pptx
Introduction to Matsuo Laboratory (ENG).pptxMatsuo Lab
 
COMPUTER 10: Lesson 7 - File Storage and Online Collaboration
COMPUTER 10: Lesson 7 - File Storage and Online CollaborationCOMPUTER 10: Lesson 7 - File Storage and Online Collaboration
COMPUTER 10: Lesson 7 - File Storage and Online Collaborationbruanjhuli
 
Spring24-Release Overview - Wellingtion User Group-1.pdf
Spring24-Release Overview - Wellingtion User Group-1.pdfSpring24-Release Overview - Wellingtion User Group-1.pdf
Spring24-Release Overview - Wellingtion User Group-1.pdfAnna Loughnan Colquhoun
 
RAG Patterns and Vector Search in Generative AI
RAG Patterns and Vector Search in Generative AIRAG Patterns and Vector Search in Generative AI
RAG Patterns and Vector Search in Generative AIUdaiappa Ramachandran
 
Crea il tuo assistente AI con lo Stregatto (open source python framework)
Crea il tuo assistente AI con lo Stregatto (open source python framework)Crea il tuo assistente AI con lo Stregatto (open source python framework)
Crea il tuo assistente AI con lo Stregatto (open source python framework)Commit University
 
UiPath Solutions Management Preview - Northern CA Chapter - March 22.pdf
UiPath Solutions Management Preview - Northern CA Chapter - March 22.pdfUiPath Solutions Management Preview - Northern CA Chapter - March 22.pdf
UiPath Solutions Management Preview - Northern CA Chapter - March 22.pdfDianaGray10
 
IaC & GitOps in a Nutshell - a FridayInANuthshell Episode.pdf
IaC & GitOps in a Nutshell - a FridayInANuthshell Episode.pdfIaC & GitOps in a Nutshell - a FridayInANuthshell Episode.pdf
IaC & GitOps in a Nutshell - a FridayInANuthshell Episode.pdfDaniel Santiago Silva Capera
 
Computer 10: Lesson 10 - Online Crimes and Hazards
Computer 10: Lesson 10 - Online Crimes and HazardsComputer 10: Lesson 10 - Online Crimes and Hazards
Computer 10: Lesson 10 - Online Crimes and HazardsSeth Reyes
 
Nanopower In Semiconductor Industry.pdf
Nanopower  In Semiconductor Industry.pdfNanopower  In Semiconductor Industry.pdf
Nanopower In Semiconductor Industry.pdfPedro Manuel
 
Meet the new FSP 3000 M-Flex800™
Meet the new FSP 3000 M-Flex800™Meet the new FSP 3000 M-Flex800™
Meet the new FSP 3000 M-Flex800™Adtran
 
NIST Cybersecurity Framework (CSF) 2.0 Workshop
NIST Cybersecurity Framework (CSF) 2.0 WorkshopNIST Cybersecurity Framework (CSF) 2.0 Workshop
NIST Cybersecurity Framework (CSF) 2.0 WorkshopBachir Benyammi
 
Artificial Intelligence & SEO Trends for 2024
Artificial Intelligence & SEO Trends for 2024Artificial Intelligence & SEO Trends for 2024
Artificial Intelligence & SEO Trends for 2024D Cloud Solutions
 
Babel Compiler - Transforming JavaScript for All Browsers.pptx
Babel Compiler - Transforming JavaScript for All Browsers.pptxBabel Compiler - Transforming JavaScript for All Browsers.pptx
Babel Compiler - Transforming JavaScript for All Browsers.pptxYounusS2
 
UiPath Studio Web workshop series - Day 6
UiPath Studio Web workshop series - Day 6UiPath Studio Web workshop series - Day 6
UiPath Studio Web workshop series - Day 6DianaGray10
 

Recently uploaded (20)

OpenShift Commons Paris - Choose Your Own Observability Adventure
OpenShift Commons Paris - Choose Your Own Observability AdventureOpenShift Commons Paris - Choose Your Own Observability Adventure
OpenShift Commons Paris - Choose Your Own Observability Adventure
 
Bird eye's view on Camunda open source ecosystem
Bird eye's view on Camunda open source ecosystemBird eye's view on Camunda open source ecosystem
Bird eye's view on Camunda open source ecosystem
 
Salesforce Miami User Group Event - 1st Quarter 2024
Salesforce Miami User Group Event - 1st Quarter 2024Salesforce Miami User Group Event - 1st Quarter 2024
Salesforce Miami User Group Event - 1st Quarter 2024
 
GenAI and AI GCC State of AI_Object Automation Inc
GenAI and AI GCC State of AI_Object Automation IncGenAI and AI GCC State of AI_Object Automation Inc
GenAI and AI GCC State of AI_Object Automation Inc
 
Machine Learning Model Validation (Aijun Zhang 2024).pdf
Machine Learning Model Validation (Aijun Zhang 2024).pdfMachine Learning Model Validation (Aijun Zhang 2024).pdf
Machine Learning Model Validation (Aijun Zhang 2024).pdf
 
KubeConEU24-Monitoring Kubernetes and Cloud Spend with OpenCost
KubeConEU24-Monitoring Kubernetes and Cloud Spend with OpenCostKubeConEU24-Monitoring Kubernetes and Cloud Spend with OpenCost
KubeConEU24-Monitoring Kubernetes and Cloud Spend with OpenCost
 
Introduction to Matsuo Laboratory (ENG).pptx
Introduction to Matsuo Laboratory (ENG).pptxIntroduction to Matsuo Laboratory (ENG).pptx
Introduction to Matsuo Laboratory (ENG).pptx
 
COMPUTER 10: Lesson 7 - File Storage and Online Collaboration
COMPUTER 10: Lesson 7 - File Storage and Online CollaborationCOMPUTER 10: Lesson 7 - File Storage and Online Collaboration
COMPUTER 10: Lesson 7 - File Storage and Online Collaboration
 
Spring24-Release Overview - Wellingtion User Group-1.pdf
Spring24-Release Overview - Wellingtion User Group-1.pdfSpring24-Release Overview - Wellingtion User Group-1.pdf
Spring24-Release Overview - Wellingtion User Group-1.pdf
 
RAG Patterns and Vector Search in Generative AI
RAG Patterns and Vector Search in Generative AIRAG Patterns and Vector Search in Generative AI
RAG Patterns and Vector Search in Generative AI
 
Crea il tuo assistente AI con lo Stregatto (open source python framework)
Crea il tuo assistente AI con lo Stregatto (open source python framework)Crea il tuo assistente AI con lo Stregatto (open source python framework)
Crea il tuo assistente AI con lo Stregatto (open source python framework)
 
UiPath Solutions Management Preview - Northern CA Chapter - March 22.pdf
UiPath Solutions Management Preview - Northern CA Chapter - March 22.pdfUiPath Solutions Management Preview - Northern CA Chapter - March 22.pdf
UiPath Solutions Management Preview - Northern CA Chapter - March 22.pdf
 
IaC & GitOps in a Nutshell - a FridayInANuthshell Episode.pdf
IaC & GitOps in a Nutshell - a FridayInANuthshell Episode.pdfIaC & GitOps in a Nutshell - a FridayInANuthshell Episode.pdf
IaC & GitOps in a Nutshell - a FridayInANuthshell Episode.pdf
 
Computer 10: Lesson 10 - Online Crimes and Hazards
Computer 10: Lesson 10 - Online Crimes and HazardsComputer 10: Lesson 10 - Online Crimes and Hazards
Computer 10: Lesson 10 - Online Crimes and Hazards
 
Nanopower In Semiconductor Industry.pdf
Nanopower  In Semiconductor Industry.pdfNanopower  In Semiconductor Industry.pdf
Nanopower In Semiconductor Industry.pdf
 
Meet the new FSP 3000 M-Flex800™
Meet the new FSP 3000 M-Flex800™Meet the new FSP 3000 M-Flex800™
Meet the new FSP 3000 M-Flex800™
 
NIST Cybersecurity Framework (CSF) 2.0 Workshop
NIST Cybersecurity Framework (CSF) 2.0 WorkshopNIST Cybersecurity Framework (CSF) 2.0 Workshop
NIST Cybersecurity Framework (CSF) 2.0 Workshop
 
Artificial Intelligence & SEO Trends for 2024
Artificial Intelligence & SEO Trends for 2024Artificial Intelligence & SEO Trends for 2024
Artificial Intelligence & SEO Trends for 2024
 
Babel Compiler - Transforming JavaScript for All Browsers.pptx
Babel Compiler - Transforming JavaScript for All Browsers.pptxBabel Compiler - Transforming JavaScript for All Browsers.pptx
Babel Compiler - Transforming JavaScript for All Browsers.pptx
 
UiPath Studio Web workshop series - Day 6
UiPath Studio Web workshop series - Day 6UiPath Studio Web workshop series - Day 6
UiPath Studio Web workshop series - Day 6
 

Spring3.0 JaxItalia09

  • 1. Spring 3.0 What‘s new Massimiliano Dessì, Pronetics S.p.A. 1
  • 2. Speaker Software Engineer and Architect ProNetics Founder Spring Italian User Group Presidente JugSardegna Onlus Committer/Contributor OpenNMS – MongoDB Autore Spring 2.5 Aspect Oriented programming Massimiliano Dessì, Pronetics S.p.a 2
  • 3. Agenda - Allineamento codice con Java 5 - Java based bean metadata - Expression Language - OXM - REST - Declarative Validation - Embedded Database Massimiliano Dessì, Pronetics S.p.a 3
  • 4. Allineamento codice Java 5 Core API allineate con Java 5 recupero di bean senza cast: T getBean(String name, Class<T> requiredType) Map<String, T> getBeansOfType (Class<T> type) Massimiliano Dessì, Pronetics S.p.a 4
  • 5. ApplicationContext <?xml version="1.0" encoding="UTF-8"?> … <bean id="uno" class="it.jax.italia.Uno”> <constructor-arg index="0” value="pippo"/> </bean> <bean id="due" class="it.jax.italia.Due" p:nome="Pluto"/> </beans> Massimiliano Dessì, Pronetics S.p.a 5
  • 6. Recupero bean ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext(”beans.xml"); Uno one = ctx.getBean("uno", Uno.class); Map<String,Due> beans = ctx.getBeansOfType(Due.class); Massimiliano Dessì, Pronetics S.p.a 6
  • 7. ApplicationEvent public class MyPublisher implements ApplicationEventPublisherAware { private ApplicationEventPublisher pub; public void setApplicationEventPublisher( ApplicationEventPublisher publisher) { pub = publisher; } public void execute(){ Evento event = new Evento(this, "Hello from mars !"); pub.publishEvent(event); } } Massimiliano Dessì, Pronetics S.p.a 7
  • 8. ApplicationListener Ora possiamo ricevere gli eventi del tipo che ci interessa anzichè dover utilizzare l’instanceof per discriminare public class EventoListener implements ApplicationListener<Evento> { public void onApplicationEvent(Evento event) { .. } } Massimiliano Dessì, Pronetics S.p.a 8
  • 9. Java based bean metadata Ora è possibile configurare l’applicationContext tramite codice Java @Configuration public class Config { private @Value("#{configProperties.url}") String url; @Bean(name="tre") public Tre treService() { return new Tre(url); } @Bean(name="quattro") public Quattro quattroService(){ return new Quattro(treService()); } } Massimiliano Dessì, Pronetics S.p.a 9
  • 10. Java based bean metadata Comunichiamo quale classe contiene la configurazione e l’eventuale properties file. <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:util="http://www.springframework.org/schema/util" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <context:component-scan base-package="it.jax.bean.metadata"/> <util:properties id="configProperties" location="classpath:it/jax/italia/bean/metadata/config.properties"/> </beans> Massimiliano Dessì, Pronetics S.p.a 10
  • 11. SpEL Spring Expression Language Si tratta di un linguaggio molto espressivo che supporta l'interrogazione e la modifica di un grafo di oggetti a runtime, utilizzabile nella configurazione xml, nelle annotazioni nelle firme dei metodi, e questo in tutti I prodotti dello Spring Portfolio Massimiliano Dessì, Pronetics S.p.a 11
  • 12. SpEL #{T(java.util.Calendar).getInstance()} #{T(Integer).toString(675)} #{T(String).CASE_INSENSITIVE_ORDER.compare(“d”,”D”)} #{new java.io.File(‘/tmp/work’).mkdir()} Massimiliano Dessì, Pronetics S.p.a 12
  • 13. SpEL Collections Proiezioni <collection‐name>.![collection‐expression] Selezioni <collection‐name>.?[collection‐expression] Massimiliano Dessì, Pronetics S.p.a 13
  • 14. SpEL Variabili implicite globali systemProperties systemEnvironment Variabili implicite runtime Web servletContext contextProperties – Web application init parameters contextAttributes – attributi Servlet context Request Session servletConfig Massimiliano Dessì, Pronetics S.p.a 14
  • 15. SpEL Variabili implicite runtime Web JSF Request/session/application requestScope sessionScope applicationScopecookie header/headerValues param/paramValues initParam view facesContext Massimiliano Dessì, Pronetics S.p.a 15
  • 16. SpEL Operatori == != < > <= >= instanceof and or ! + ‐*/%^ <expression>? If‐true‐result : if‐false‐result <expression>?: if‐null‐result (Elvis with default) Massimiliano Dessì, Pronetics S.p.a 16
  • 17. SpEL XML Utilizzabile nella configurazione XML dove posso anche riferirli tra loro <bean id="numberGuess" class="org.spring.samples.NumberGuess" p:randomNumber="#{ T(java.lang.Math).random() * 100.0 }"/> <bean id="shapeGuess" class="org.spring.samples.ShapeGuess" p:initialShapeSeed="#{ numberGuess.randomNumber }"/> Massimiliano Dessì, Pronetics S.p.a 17
  • 18. SpEL nel codice private MovieFinder movieFinder; private String defaultLocale; @Value("#{ systemProperties['user.region'] }") public void setDefaultLocale(String defaultLocale){ this.defaultLocale = defaultLocale; } @Autowired public void configure(MovieFinder movieFinder, @Value("#{ systemProperties['user.region'] } String defaultLocale){ this.movieFinder = movieFinder; this.defaultLocale = defaultLocale; } Massimiliano Dessì, Pronetics S.p.a 18
  • 19. SpEL Security @PreAuthorize("hasRole('ROLE_SUPERVISOR') or " + "hasRole('ROLE_TELLER') and " + "(#account.balance + #amount >= -#account.overdraft)" ) public void post(Account account, double amount); Massimiliano Dessì, Pronetics S.p.a 19
  • 20. Object XML Mapping In Spring 3.0 è stato creato il package org.springframework.oxm dove troviamo public interface Marshaller { /** * Marshals the object graph with the given root into the provided Result. */ void marshal(Object graph, Result result) throws XmlMappingException, IOException; } Massimiliano Dessì, Pronetics S.p.a 20
  • 21. Object XML Mapping e l’ unmarshall public interface Unmarshaller { /** * Unmarshals the given provided Source into an object graph. */ Object unmarshal(Source source) throws XmlMappingException, IOException; } Massimiliano Dessì, Pronetics S.p.a 21
  • 22. Object XML Mapping Viene fornita l’implementazione con: JAXB 2 Castor XMLBeans JiBX XStream Massimiliano Dessì, Pronetics S.p.a 22
  • 23. Object XML Mapping Per utilizzare JAXB2 si utilizza nella configurazione XML <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance xmlns:oxm=http://www.springframework.org/schema/oxm xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/oxm http://www.springframework.org/schema/oxm/spring-oxm-3.0.xsd"> <oxm:jaxb2-marshaller id="marshaller"> <oxm:class-to-be-bound name="org.samples.airline.schema.Airport"/> <oxm:class-to-be-bound name="org.samples.airline.schema.Flight"/> </oxm:jaxb2-marshaller> <oxm:jaxb2-marshaller id="marshaller" contextPath="org.springframework.ws.samples.airline.schema"/> Massimiliano Dessì, Pronetics S.p.a 23
  • 24. Object XML Mapping Per utilizzare CASTOR si utilizza nella configurazione XML <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance xmlns:oxm=http://www.springframework.org/schema/oxm xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/oxm http://www.springframework.org/schema/oxm/spring-oxm-3.0.xsd"> <bean id="castorMarshaller class="org.springframework.oxm.castor.CastorMarshaller" p:mappingLocation="classpath:mapping.xml" /> Massimiliano Dessì, Pronetics S.p.a 24
  • 25. Object XML Mapping Per utilizzare XMLBeans si utilizza nella configurazione XML <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance xmlns:oxm=http://www.springframework.org/schema/oxm xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/oxm http://www.springframework.org/schema/oxm/spring-oxm-3.0.xsd"> <oxm:xmlbeans-marshaller id="marshaller"/> Massimiliano Dessì, Pronetics S.p.a 25
  • 26. Object XML Mapping Per utilizzare JiBX si utilizza nella configurazione XML <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance xmlns:oxm=http://www.springframework.org/schema/oxm xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/oxm http://www.springframework.org/schema/oxm/spring-oxm-3.0.xsd"> <oxm:jibx-marshaller id="marshaller" target-class="org.springframework.ws.samples.airline.schema.Flight"/> Massimiliano Dessì, Pronetics S.p.a 26
  • 27. Object XML Mapping Per utilizzare XSTREAM si utilizza nella configurazione XML <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance xmlns:oxm=http://www.springframework.org/schema/oxm xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/oxm http://www.springframework.org/schema/oxm/spring-oxm-3.0.xsd"> <bean id="xstreamMarshaller" class="org.springframework.oxm.xstream.XStreamMarshaller"> <property name="aliases"> <props> <prop key="Flight">org.springframework.oxm.xstream.Flight</prop> </props> </property> </bean> Massimiliano Dessì, Pronetics S.p.a 27
  • 28. Date Time support public class AnnotationDrivenDateTimeFormattingShowcase { // by default, printed & parsed using localized short datetime format (no annotation required) e.g. Locale.US=mm/dd/yyyy h:mm:ss a private Date dateField; // printed & parsed using localized short date format e.g. Locale.US=mm/dd/yyyy @DateTimeFormat(dateStyle = Style.SHORT) private Date shortDateField; // printed & parsed using localized short time format e.g Locale.US=h:mm:ss a @DateTimeFormat(timeStyle = Style.SHORT) private Date shortTimeField; // printed & parsed using custom datetime pattern @DateTimeFormat(pattern = "yyyy/mm/dd") private Date dateFieldCustomPattern; Massimiliano Dessì, Pronetics S.p.a 28
  • 29. Date Time support // by default, printed & parsed using localized short datetime format (no annotation required) e.g. Locale.US=mm/dd/yyyy h:mm:ss a private DateTime jodaDateField; // printed & parsed using localized short date format e.g. Locale.US=mm/dd/yyyy @DateTimeFormat(dateStyle = Style.SHORT) private DateTime shortJodaDateField; // printed & parsed using default ISO date time format yyyy-mm-ddThh:mm:ss.SSSZ @ISODateTimeFormat private Date isoDateField; // by default, printed & parsed using localized short datetime format (no annotaiton required) e.g. Locale.US=mm/dd/yyyy h:mm:ss a private Calendar calendar; // printed & parsed using localized short date format e.g. Locale.US=mm/dd/yyyy @DateTimeFormat(dateStyle = Style.SHORT) private Calendar shortCalendar; Massimiliano Dessì, Pronetics S.p.a 29
  • 30. Date Time support // printed & parsed using short datetime format e.g. Locale.US=mm/dd/yyyy h:mm:ss @DateTimeFormat(dateStyle = Style.SHORT, timeStyle=Style.SHORT) private Long millis; /* @Controller method using @DateTimeFormat annotation on method param to specify format of 'dateParam' request parameter*/ @RequestMapping public void handlerMethod(@RequestParam @DateTimeFormat(dateStyle = Style.SHORT) Date dateParam) { } } Massimiliano Dessì, Pronetics S.p.a 30
  • 31. MVC namespace Spring 3.0 RC2 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns=http://www.springframework.org/schema/beans xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance xmlns:mvc=http://www.springframework.org/schema/mvc xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd"> <!-- Turns on support for mapping requests to Spring MVC @Controller methods Also registers default Formatters and Validators for use across all @Controllers --> <mvc:annotated-controllers /> </beans> Massimiliano Dessì, Pronetics S.p.a 31
  • 32. MVC namespace <mvc:annotated-controllers /> indica l’abilitazione dei seguenti bean <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" p:order=1/> <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> <property name="webBindingInitializer"> <bean class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer"> <property name="conversionService" ref="conversionService" /> <property name="validator" ref="validator" /> </bean> </property> </bean> <bean id="conversionService" class="org.springframework.samples.petclinic.util.PetclinicConversionServiceFactory" /> <bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean" /> Massimiliano Dessì, Pronetics S.p.a 32
  • 33. REST •  Uri Template support (Client e Controller) •  Rappresentazione HTML, XML, RSS, Atom, PDF, Excel, JSON •  Filtro servlet per il supporto PUT/DELETE •  Costruito su SpringMVC Massimiliano Dessì, Pronetics S.p.a 33
  • 34. REST Possiamo utilizzare delle mappature Rest style: @RequestMapping(value = "/articles/{id}", method = RequestMethod.GET) public ModelAndView getArticle(@PathVariable("id") String id) { return new ModelAndView("articleView", "article", articleFacade.getArticle(id)); } E avere content negotiation nel view resolver Massimiliano Dessì, Pronetics S.p.a 34
  • 35. REST Accedere ai cookie e agli header della request attraverso le annotazioni @RequestMapping("/show") public ModelAndView getInfo(@RequestHeader("region") long regionId, @CookieValue("language") String langId) { ... } Massimiliano Dessì, Pronetics S.p.a 35
  • 36. REST Sopratutto abbiamo un RESTTemplate che come glialtriSpringtemplate semplifica le chiamate REST HTTP RestTemplate DELETE delete(String, String...) GET getForObject(String, Class, String...) HEAD headForHeaders(String, String...) OPTIONS optionsForAllow(String, String...) POST postForLocation(String, Object, String) PUT put(String, Object, String...) Massimiliano Dessì, Pronetics S.p.a 36
  • 37. REST Gli oggetti da e per i metodi del RestTemplate passano attraverso messageconverters per essere convertiti. ByteArrayHttpMessageConverter StringHttpMessageConverter FormHttpMessageConverter SourceHttpMessageConverter MarshallingHttpMessageConverter BufferedImageHttpMessageConverter Il RestTemplate ci permette quindi di fare chiamate da e verso servizi REST in modo semplificato. Massimiliano Dessì, Pronetics S.p.a 37
  • 38. REST Se abbiamo un controller che ha un mappatura di questo tipo: @Controller public class RestController { @RequestMapping(value= "/books/{book}/{pg}”,method = RequestMethod.GET) public String getArticle(@PathVariable("book") String book, @PathVariable("pg") String pg){ … } Massimiliano Dessì, Pronetics S.p.a 38
  • 39. REST Possiamo interrogare il controller precedente attraverso il RestTemplate RestTemplate restTemplate = new RestTemplate(); Map<String,String> vars = new HashMap<String,String>(); vars.put("book", "sandokan"); vars.put("pg", "21"); String uri = "http://example.com/books/{book}/{pg}"; String result = restTemplate.getForObject(uri, String.class, vars); Massimiliano Dessì, Pronetics S.p.a 39
  • 40. Validazione dichiarativa Nelle classi import javax.validation.constraints.Max; import javax.validation.constraints.Min; import javax.validation.constraints.NotNull; public class MyBean { @NotNull @Max(64) private String name; @Min(0) private int age; } Massimiliano Dessì, Pronetics S.p.a 40
  • 41. Validazione dichiarativa Configuriamo un JSR 303 validator <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> <property name="webBindingInitializer”> <bean class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer"> <property name="validator" ref="validator" /> </bean> </property> </bean> <bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean" /> Possiamo così usare l’annotazione @Valid nei metodi dei Controller @RequestMapping("/foo", method=RequestMethod.POST) public void processFoo(@Valid Foo foo) { ... } Massimiliano Dessì, Pronetics S.p.a 41
  • 42. Database embedded Supporto per H2, Derby, HSQL Nella configurazione <jdbc:embedded-database id="dataSource"> <jdbc:script location="classpath:schema.sql"/> <jdbc:script location="classpath:test-data.sql"/> </jdbc:embedded-database> Massimiliano Dessì, Pronetics S.p.a 42
  • 43. Database embedded Utile soprattutto per l’ utilizzo nei test EmbeddedDatabaseBuilder builder = new EmbeddedDatabaseBuilder(); EmbeddedDatabase db = builder.type(EmbeddedDatabaseType.H2). script("schema.sql").script("test-data.sql").build(); // do stuff against the db (EmbeddedDatabase extends javax.sql.DataSource) db.shutdown(); Massimiliano Dessì, Pronetics S.p.a 43
  • 44. Database embedded Domande ? Massimiliano Dessì, Pronetics S.p.a 44
  • 45. Grazie per l’attenzione ! Massimiliano Dessì desmax74 at yahoo.it massimiliano.dessi at pronetics.it http://twitter.com/desmax74 http://jroller.com/desmax http://www.linkedin.com/in/desmax74 http://wiki.java.net/bin/view/People/MassimilianoDessi http://www.jugsardegna.org/vqwiki/jsp/Wiki?MassimilianoDessi Spring Framework Italian User Group http://it.groups.yahoo.com/group/SpringFramework-it Massimiliano Dessì, Pronetics S.p.a 45