Spring User Group France Spring 3.0 Arnaud Cogoluègnes 25/02/2010
Agenda Un peu d'histoire...
Les nouveautés de Spring 3.0 Java 5, Expression Language, REST, etc. So what?
Conclusion
Speaker Arnaud Cogoluègnes Consultant chez Zenika
Utilise Spring depuis 2005
Certifié « Spring Core » et formateur certifié SpringSource
Co-auteur : Spring par la pratique 2nde édition Spring Dynamic Modules in Action Manning Editions http://manning.com/cogoluegnes A paraître mi 2010 acogoluegnes
Agenda Un peu d'histoire...
Les nouveautés de Spring 3.0 Java 5, Expression Language, REST, etc. So what?
Conclusion
Un peu d'histoire v. 0.9 : juin 2003 (toutes les bases)
v. 1.0 : mars 2004
v. 1.1 : septembre 2004
v. 1.2 : mai 2005
v. 2.0 : octobre 2006 (namespaces XML)
v. 2.5 : novembre 2007 (annotations)
v. 3.0 : décembre 2009
Agenda Un peu d'histoire... Les différentes version de Spring Les nouveautés de Spring 3.0 Java 5, Expression Language, REST, etc. So what?
Conclusion
Nouveautés Spring 3.0 Java 5
Spring Expression Language
Support REST
Scheduling
Divers Base de données embarquées
Support JSR-330 « Dependency Injection for Java »
Validation avec JSR-303 « Bean Validation »
Configuration 100% Java Les parties dépréciées et supprimées
Java 5 Toute l'API de Spring tire profit de Java varargs, générique Modules « visibles » affectés Accès aux données : JDBC, Hibernate, transaction
Événement du contexte (ApplicationListener)
Extensions du conteneur léger (FactoryBean)
Java 5 / JDBC public   class  ContactRowMapper  implements  RowMapper<Contact> { @Override public  Contact mapRow(ResultSet rs,  int  index)  throws  SQLException { Contact contact =  new  Contact(); ... return  contact; } } Contact contact = jdbcTpl.queryForObject( &quot;select * from contact where id = ?&quot; , new  ContactRowMapper(),id ); List<Contact> contacts = jdbcTpl.query( &quot;select * from contact where nom =  ?&quot; , new  ContactRowMapper(),  nom ); Générique Varargs
Java 5 / Hibernate Contact contact = hibTpl.get(Contact. class , id); (...) contact = hibTpl.execute( new  HibernateCallback<Contact>() { @Override public  Contact doInHibernate(Session session) throws  HibernateException, SQLException { Contact localContact=  null ; // init contact avec session return  localContact; } }); Générique
Java 5 / Transaction TransactionTemplate trTemplate = (...) int  nbBatch = (...) for ( int  i=0;i<nbBatch;i++) { Contact contact = trTemplate.execute( new  TransactionCallback<Contact>() { @Override public  Contact doInTransaction(TransactionStatus ts) { Contact contact =  null ; // traitement transactionnel return  contact; } }); } Générique
Java 5 / le reste Sans oublier les points d'extension FactoryBean
ApplicationListener
etc.
Java 5 Peu d'impact sur le code applicatif Spring n'est pas censé être intrusif Plus d'impact sur les  API existantes et à venir ex. : conversion, binding dans 3.0 les projets du portfolio
Spring Expression Language (SpEL) Quoi ? Un langage d'expressions Du type Unified EL, OGNL Pour ? Exprimer des concepts complexes De façon succincte Où ? Dans les fichiers de configuration Spring
Dans des JSP (<spring:eval>)
Va arriver dans les projets du portfolio
API pour intégrer le SpEL dans une application
SpEL / Configuration Dans un fichier XML : Avec une annotation : < bean   id = &quot;taxCalculator&quot;   class = &quot;org.spring.samples.TaxCalculator&quot; > < property   name = &quot;defaultLocale&quot; value = &quot; #{systemProperties['user.region']} &quot; /> </ bean > public   static   class  FieldValueTestBean @ Value( &quot;#{systemProperties['user.region']}&quot; ) private  String defaultLocale; (...) }
SpEL / Syntaxe Syntaxe Type someTable[2] tableau someMap['someKey'] map contact.prenom  propriété contact.Prenom propriété contact.getPrenom() propriété 'abc'.substring(2, 3) méthode 2 == 2 opérateur 2 < -5.0 opérateur
SpEL / Syntaxe Syntaxe Type '5.00' matches '^-?\\d+(\\.\\d{2})?$' regex isMember('Nikola Tesla') and isMember('Mihajlo Pupin') opérateur logique 'test' + ' ' + 'string'  concaténation 6 / -3 opération prenom != null ? prenom : 'inconnu' opérateur ternaire prenom ?: 'inconnu' opérateur Elvis PlaceOfBirth?.City safe navigation Et bien d'autres choses encore...
SpEL / API Simple à embarquer dans une application : ExpressionParser parser =  new  SpelExpressionParser(); Expression exp = parser.parseExpression( &quot;'Hello World'&quot; ); String message = (String) exp.getValue(); (...) String message = exp.getValue(String. class );
SpEL / quand utiliser ? A utiliser pour faciliter la configuration XML ou annotation Permet d'implémenter de la logique de configuration aisément
Ne pas en abuser ! (pas de logique métier)
SpEL / variables Des variables sont disponibles dans un contexte Spring systemProperties
systemEnvironment
Nom de chaque bean Spring du contexte
request (Web)
session (Web)
SpEL / configuration multi-environnements < bean class = &quot;org.springframework.beans.factory.config. PropertyPlaceholderConfigurer&quot; > < property   name = &quot;location&quot; value = &quot; #{systemProperties['environment'] ?: 'dev'}/conf.properties &quot;   /> </ bean > java -jar server.jar -Denvironment=prod
SpEL / scope & variable public   interface  ContactService { List<Contact> getContactsPrivilegies(Long idUser); } < bean   class = &quot;com.zenika.contact.domaine.InfoUtilisateurImpl&quot; scope = &quot;request&quot; > < aop:scoped-proxy   proxy-target-class = &quot;false&quot; /> < property   name = &quot;contactsPrivilegies&quot;   value = &quot; #{contactService.getContactsPrivilegies(request.getParameter('idUser'))}  &quot;   /> </ bean > Bean Spring Variable par défaut (requête HTTP courante)
SpEL / Spring Security Sécuriser une URL < http   use-expressions = &quot;true&quot; > < intercept-url   pattern = &quot;/secure/**&quot; access = &quot;hasRole('ROLE_SUPERVISOR') and hasIpAddress('192.168.1.0/24')&quot;   /> ... </ http > Méthodes « bindées »
SpEL / Spring Security Sécuriser des appels de méthodes @ PreAuthorize( &quot;hasRole('ROLE_USER')&quot; ) public   void  create(Contact contact); Paramètre de la méthode @ PreAuthorize( &quot;hasPermission(#contact, 'admin')&quot; ) public   void  deletePermission(Contact contact, Sid recipient, Permission permission); @ PreAuthorize( &quot;#contact.name == principal.name)&quot; ) public   void  doSomething(Contact contact); Paramètre de la méthode Contexte de sécurité
SpEL / Spring Batch Rendre la configuration plus dynamique JobParameters jobParameters =  new  JobParametersBuilder() .addString( &quot;input.file&quot; ,  &quot;foo.txt&quot; ).toJobParameters(); Accessible dans la configuration <bean  id = &quot;reader&quot;   class = &quot;org.springframework.batch.item.file.FlatFileItemReader&quot; scope = &quot;step&quot; > (...)  <property  name = &quot;resource&quot;   value = &quot;#{jobParameters[input.file]}&quot;  /> </bean>
Support REST Spring MVC « Service Oriented » Quelques annotations pour un contrôleur REST Support de types de vues supplémentaires Spring OXM dans Spring Core (XML)
Atom et RSS
JSON Un support client pour consommer des services REST
Support REST Qu'est-ce que REST ? Un style d'architecture
Pour les systèmes distribués

Spring 3.0

  • 1.
    Spring User GroupFrance Spring 3.0 Arnaud Cogoluègnes 25/02/2010
  • 2.
    Agenda Un peud'histoire...
  • 3.
    Les nouveautés deSpring 3.0 Java 5, Expression Language, REST, etc. So what?
  • 4.
  • 5.
    Speaker Arnaud CogoluègnesConsultant chez Zenika
  • 6.
  • 7.
    Certifié « Spring Core »et formateur certifié SpringSource
  • 8.
    Co-auteur : Springpar la pratique 2nde édition Spring Dynamic Modules in Action Manning Editions http://manning.com/cogoluegnes A paraître mi 2010 acogoluegnes
  • 9.
    Agenda Un peud'histoire...
  • 10.
    Les nouveautés deSpring 3.0 Java 5, Expression Language, REST, etc. So what?
  • 11.
  • 12.
    Un peu d'histoirev. 0.9 : juin 2003 (toutes les bases)
  • 13.
    v. 1.0 :mars 2004
  • 14.
    v. 1.1 :septembre 2004
  • 15.
    v. 1.2 :mai 2005
  • 16.
    v. 2.0 :octobre 2006 (namespaces XML)
  • 17.
    v. 2.5 :novembre 2007 (annotations)
  • 18.
    v. 3.0 :décembre 2009
  • 19.
    Agenda Un peud'histoire... Les différentes version de Spring Les nouveautés de Spring 3.0 Java 5, Expression Language, REST, etc. So what?
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
    Divers Base dedonnées embarquées
  • 26.
    Support JSR-330 « DependencyInjection for Java »
  • 27.
    Validation avec JSR-303« Bean Validation »
  • 28.
    Configuration 100% JavaLes parties dépréciées et supprimées
  • 29.
    Java 5 Toutel'API de Spring tire profit de Java varargs, générique Modules « visibles » affectés Accès aux données : JDBC, Hibernate, transaction
  • 30.
    Événement du contexte(ApplicationListener)
  • 31.
    Extensions du conteneurléger (FactoryBean)
  • 32.
    Java 5 /JDBC public class ContactRowMapper implements RowMapper<Contact> { @Override public Contact mapRow(ResultSet rs, int index) throws SQLException { Contact contact = new Contact(); ... return contact; } } Contact contact = jdbcTpl.queryForObject( &quot;select * from contact where id = ?&quot; , new ContactRowMapper(),id ); List<Contact> contacts = jdbcTpl.query( &quot;select * from contact where nom = ?&quot; , new ContactRowMapper(), nom ); Générique Varargs
  • 33.
    Java 5 /Hibernate Contact contact = hibTpl.get(Contact. class , id); (...) contact = hibTpl.execute( new HibernateCallback<Contact>() { @Override public Contact doInHibernate(Session session) throws HibernateException, SQLException { Contact localContact= null ; // init contact avec session return localContact; } }); Générique
  • 34.
    Java 5 /Transaction TransactionTemplate trTemplate = (...) int nbBatch = (...) for ( int i=0;i<nbBatch;i++) { Contact contact = trTemplate.execute( new TransactionCallback<Contact>() { @Override public Contact doInTransaction(TransactionStatus ts) { Contact contact = null ; // traitement transactionnel return contact; } }); } Générique
  • 35.
    Java 5 /le reste Sans oublier les points d'extension FactoryBean
  • 36.
  • 37.
  • 38.
    Java 5 Peud'impact sur le code applicatif Spring n'est pas censé être intrusif Plus d'impact sur les API existantes et à venir ex. : conversion, binding dans 3.0 les projets du portfolio
  • 39.
    Spring Expression Language(SpEL) Quoi ? Un langage d'expressions Du type Unified EL, OGNL Pour ? Exprimer des concepts complexes De façon succincte Où ? Dans les fichiers de configuration Spring
  • 40.
    Dans des JSP(<spring:eval>)
  • 41.
    Va arriver dansles projets du portfolio
  • 42.
    API pour intégrerle SpEL dans une application
  • 43.
    SpEL / ConfigurationDans un fichier XML : Avec une annotation : < bean id = &quot;taxCalculator&quot; class = &quot;org.spring.samples.TaxCalculator&quot; > < property name = &quot;defaultLocale&quot; value = &quot; #{systemProperties['user.region']} &quot; /> </ bean > public static class FieldValueTestBean @ Value( &quot;#{systemProperties['user.region']}&quot; ) private String defaultLocale; (...) }
  • 44.
    SpEL / SyntaxeSyntaxe Type someTable[2] tableau someMap['someKey'] map contact.prenom propriété contact.Prenom propriété contact.getPrenom() propriété 'abc'.substring(2, 3) méthode 2 == 2 opérateur 2 < -5.0 opérateur
  • 45.
    SpEL / SyntaxeSyntaxe Type '5.00' matches '^-?\\d+(\\.\\d{2})?$' regex isMember('Nikola Tesla') and isMember('Mihajlo Pupin') opérateur logique 'test' + ' ' + 'string' concaténation 6 / -3 opération prenom != null ? prenom : 'inconnu' opérateur ternaire prenom ?: 'inconnu' opérateur Elvis PlaceOfBirth?.City safe navigation Et bien d'autres choses encore...
  • 46.
    SpEL / APISimple à embarquer dans une application : ExpressionParser parser = new SpelExpressionParser(); Expression exp = parser.parseExpression( &quot;'Hello World'&quot; ); String message = (String) exp.getValue(); (...) String message = exp.getValue(String. class );
  • 47.
    SpEL / quandutiliser ? A utiliser pour faciliter la configuration XML ou annotation Permet d'implémenter de la logique de configuration aisément
  • 48.
    Ne pas enabuser ! (pas de logique métier)
  • 49.
    SpEL / variablesDes variables sont disponibles dans un contexte Spring systemProperties
  • 50.
  • 51.
    Nom de chaquebean Spring du contexte
  • 52.
  • 53.
  • 54.
    SpEL / configurationmulti-environnements < bean class = &quot;org.springframework.beans.factory.config. PropertyPlaceholderConfigurer&quot; > < property name = &quot;location&quot; value = &quot; #{systemProperties['environment'] ?: 'dev'}/conf.properties &quot; /> </ bean > java -jar server.jar -Denvironment=prod
  • 55.
    SpEL / scope& variable public interface ContactService { List<Contact> getContactsPrivilegies(Long idUser); } < bean class = &quot;com.zenika.contact.domaine.InfoUtilisateurImpl&quot; scope = &quot;request&quot; > < aop:scoped-proxy proxy-target-class = &quot;false&quot; /> < property name = &quot;contactsPrivilegies&quot; value = &quot; #{contactService.getContactsPrivilegies(request.getParameter('idUser'))} &quot; /> </ bean > Bean Spring Variable par défaut (requête HTTP courante)
  • 56.
    SpEL / SpringSecurity Sécuriser une URL < http use-expressions = &quot;true&quot; > < intercept-url pattern = &quot;/secure/**&quot; access = &quot;hasRole('ROLE_SUPERVISOR') and hasIpAddress('192.168.1.0/24')&quot; /> ... </ http > Méthodes « bindées »
  • 57.
    SpEL / SpringSecurity Sécuriser des appels de méthodes @ PreAuthorize( &quot;hasRole('ROLE_USER')&quot; ) public void create(Contact contact); Paramètre de la méthode @ PreAuthorize( &quot;hasPermission(#contact, 'admin')&quot; ) public void deletePermission(Contact contact, Sid recipient, Permission permission); @ PreAuthorize( &quot;#contact.name == principal.name)&quot; ) public void doSomething(Contact contact); Paramètre de la méthode Contexte de sécurité
  • 58.
    SpEL / SpringBatch Rendre la configuration plus dynamique JobParameters jobParameters = new JobParametersBuilder() .addString( &quot;input.file&quot; , &quot;foo.txt&quot; ).toJobParameters(); Accessible dans la configuration <bean id = &quot;reader&quot; class = &quot;org.springframework.batch.item.file.FlatFileItemReader&quot; scope = &quot;step&quot; > (...) <property name = &quot;resource&quot; value = &quot;#{jobParameters[input.file]}&quot; /> </bean>
  • 59.
    Support REST SpringMVC « Service Oriented » Quelques annotations pour un contrôleur REST Support de types de vues supplémentaires Spring OXM dans Spring Core (XML)
  • 60.
  • 61.
    JSON Un supportclient pour consommer des services REST
  • 62.
    Support REST Qu'est-ceque REST ? Un style d'architecture
  • 63.
    Pour les systèmesdistribués