SlideShare une entreprise Scribd logo
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

Contenu connexe

Tendances

Introduction à spring boot
Introduction à spring bootIntroduction à spring boot
Introduction à spring boot
Antoine Rey
 
ParisJUG Spring Boot
ParisJUG Spring BootParisJUG Spring Boot
ParisJUG Spring Boot
Julien Sadaoui
 
Workshop Spring - Session 5 - Spring Integration
Workshop Spring - Session 5 - Spring IntegrationWorkshop Spring - Session 5 - Spring Integration
Workshop Spring - Session 5 - Spring Integration
Antoine Rey
 
Architecture java j2 ee a partager
Architecture java j2 ee a partagerArchitecture java j2 ee a partager
Architecture java j2 ee a partager
aliagadir
 
Workshop Spring - Session 4 - Spring Batch
Workshop Spring -  Session 4 - Spring BatchWorkshop Spring -  Session 4 - Spring Batch
Workshop Spring - Session 4 - Spring Batch
Antoine Rey
 
Quoi de neuf à Devoxx France 2017 ?
Quoi de neuf à Devoxx France 2017 ?Quoi de neuf à Devoxx France 2017 ?
Quoi de neuf à Devoxx France 2017 ?
Antoine Rey
 
Presentation JEE et son écossystéme
Presentation JEE et son écossystémePresentation JEE et son écossystéme
Presentation JEE et son écossystéme
Algeria JUG
 
Workshop spring session 2 - La persistance au sein des applications Java
Workshop spring   session 2 - La persistance au sein des applications JavaWorkshop spring   session 2 - La persistance au sein des applications Java
Workshop spring session 2 - La persistance au sein des applications Java
Antoine Rey
 
Support JEE Servlet Jsp MVC M.Youssfi
Support JEE Servlet Jsp MVC M.YoussfiSupport JEE Servlet Jsp MVC M.Youssfi
Support JEE Servlet Jsp MVC M.Youssfi
ENSET, Université Hassan II Casablanca
 
Spring par la pratique chap-7 - mvc
Spring par la pratique  chap-7 - mvcSpring par la pratique  chap-7 - mvc
Spring par la pratique chap-7 - mvc
Florent Breton
 
Et pourquoi pas JEE ?
Et pourquoi pas JEE ?Et pourquoi pas JEE ?
Et pourquoi pas JEE ?
PALO IT
 
Concevoir, développer et sécuriser des micro-services avec Spring Boot
Concevoir, développer et sécuriser des micro-services avec Spring BootConcevoir, développer et sécuriser des micro-services avec Spring Boot
Concevoir, développer et sécuriser des micro-services avec Spring Boot
DNG Consulting
 
Retours Devoxx France 2016
Retours Devoxx France 2016Retours Devoxx France 2016
Retours Devoxx France 2016
Antoine Rey
 
Prsentation de-javaserver-faces4124
Prsentation de-javaserver-faces4124Prsentation de-javaserver-faces4124
Prsentation de-javaserver-faces4124
Mejdeddine Bouzouita
 
Spring ioc
Spring iocSpring ioc
Spring ioc
Lhouceine OUHAMZA
 
Spring mvc
Spring mvcSpring mvc
Spring mvc
Lhouceine OUHAMZA
 
Formation jpa-hibernate-spring-data
Formation jpa-hibernate-spring-dataFormation jpa-hibernate-spring-data
Formation jpa-hibernate-spring-data
Lhouceine OUHAMZA
 
Aspect avec AspectJ
Aspect avec AspectJAspect avec AspectJ
Aspect avec AspectJ
simeon
 
Tech Days Spring Intégration
Tech Days Spring IntégrationTech Days Spring Intégration
Tech Days Spring Intégration
Arrow-Institute
 

Tendances (20)

Introduction à spring boot
Introduction à spring bootIntroduction à spring boot
Introduction à spring boot
 
ParisJUG Spring Boot
ParisJUG Spring BootParisJUG Spring Boot
ParisJUG Spring Boot
 
Workshop Spring - Session 5 - Spring Integration
Workshop Spring - Session 5 - Spring IntegrationWorkshop Spring - Session 5 - Spring Integration
Workshop Spring - Session 5 - Spring Integration
 
Architecture java j2 ee a partager
Architecture java j2 ee a partagerArchitecture java j2 ee a partager
Architecture java j2 ee a partager
 
Workshop Spring - Session 4 - Spring Batch
Workshop Spring -  Session 4 - Spring BatchWorkshop Spring -  Session 4 - Spring Batch
Workshop Spring - Session 4 - Spring Batch
 
Quoi de neuf à Devoxx France 2017 ?
Quoi de neuf à Devoxx France 2017 ?Quoi de neuf à Devoxx France 2017 ?
Quoi de neuf à Devoxx France 2017 ?
 
Presentation JEE et son écossystéme
Presentation JEE et son écossystémePresentation JEE et son écossystéme
Presentation JEE et son écossystéme
 
Workshop spring session 2 - La persistance au sein des applications Java
Workshop spring   session 2 - La persistance au sein des applications JavaWorkshop spring   session 2 - La persistance au sein des applications Java
Workshop spring session 2 - La persistance au sein des applications Java
 
Support JEE Servlet Jsp MVC M.Youssfi
Support JEE Servlet Jsp MVC M.YoussfiSupport JEE Servlet Jsp MVC M.Youssfi
Support JEE Servlet Jsp MVC M.Youssfi
 
Tuto spring
Tuto springTuto spring
Tuto spring
 
Spring par la pratique chap-7 - mvc
Spring par la pratique  chap-7 - mvcSpring par la pratique  chap-7 - mvc
Spring par la pratique chap-7 - mvc
 
Et pourquoi pas JEE ?
Et pourquoi pas JEE ?Et pourquoi pas JEE ?
Et pourquoi pas JEE ?
 
Concevoir, développer et sécuriser des micro-services avec Spring Boot
Concevoir, développer et sécuriser des micro-services avec Spring BootConcevoir, développer et sécuriser des micro-services avec Spring Boot
Concevoir, développer et sécuriser des micro-services avec Spring Boot
 
Retours Devoxx France 2016
Retours Devoxx France 2016Retours Devoxx France 2016
Retours Devoxx France 2016
 
Prsentation de-javaserver-faces4124
Prsentation de-javaserver-faces4124Prsentation de-javaserver-faces4124
Prsentation de-javaserver-faces4124
 
Spring ioc
Spring iocSpring ioc
Spring ioc
 
Spring mvc
Spring mvcSpring mvc
Spring mvc
 
Formation jpa-hibernate-spring-data
Formation jpa-hibernate-spring-dataFormation jpa-hibernate-spring-data
Formation jpa-hibernate-spring-data
 
Aspect avec AspectJ
Aspect avec AspectJAspect avec AspectJ
Aspect avec AspectJ
 
Tech Days Spring Intégration
Tech Days Spring IntégrationTech Days Spring Intégration
Tech Days Spring Intégration
 

En vedette

Tarea informática
Tarea informáticaTarea informática
Tarea informática
Karen Quijano
 
Deri rapport%20annuel fr.pdf
Deri rapport%20annuel fr.pdfDeri rapport%20annuel fr.pdf
Deri rapport%20annuel fr.pdf
www.bourse-maroc.org
 
Modulo3
Modulo3Modulo3
Modulo3
cefic
 
Sortzen Topagunea: objetivos de la red
Sortzen Topagunea: objetivos de la redSortzen Topagunea: objetivos de la red
Sortzen Topagunea: objetivos de la red
Sortzen Urola Garaian
 
Guia de apoyoqr
Guia de apoyoqrGuia de apoyoqr
TECNOLOGIA
TECNOLOGIATECNOLOGIA
TECNOLOGIA
Daniel Salas
 
Modulo1
Modulo1Modulo1
Modulo1
cefic
 
E:\Claude LéVi Strauss
E:\Claude LéVi StraussE:\Claude LéVi Strauss
E:\Claude LéVi Strauss
ali169
 
Etes vous prêts pour le Web 3.0
Etes vous prêts pour le Web 3.0Etes vous prêts pour le Web 3.0
Etes vous prêts pour le Web 3.0
Kamel Djebrouni
 
Du web 2.0 au web 3.0 adbgv 8 juin 2010 montpellier
Du web 2.0 au web 3.0 adbgv 8 juin 2010 montpellierDu web 2.0 au web 3.0 adbgv 8 juin 2010 montpellier
Du web 2.0 au web 3.0 adbgv 8 juin 2010 montpellier
Franck Queyraud
 
In-Memory Computing with SAP HANA™
In-Memory Computing with SAP HANA™In-Memory Computing with SAP HANA™
In-Memory Computing with SAP HANA™
David Graham
 
Quantifying Social Selling - 2015 LinkedIn Sales Data
Quantifying Social Selling - 2015 LinkedIn Sales DataQuantifying Social Selling - 2015 LinkedIn Sales Data
Quantifying Social Selling - 2015 LinkedIn Sales Data
Katie Yrazabal Baudler
 
EJUN Finance Introduction - English
EJUN Finance Introduction - EnglishEJUN Finance Introduction - English
EJUN Finance Introduction - English
Patrick Schaufelberger
 
EECS 442 ckershaw presentation
EECS 442 ckershaw presentationEECS 442 ckershaw presentation
EECS 442 ckershaw presentation
ckershawumich
 
Snapchat presentation karlrhen
Snapchat presentation karlrhenSnapchat presentation karlrhen
Snapchat presentation karlrhen
Karl Henderson
 

En vedette (20)

Flash BCP Juin 2011 CFG
Flash BCP Juin 2011 CFGFlash BCP Juin 2011 CFG
Flash BCP Juin 2011 CFG
 
Tarea informática
Tarea informáticaTarea informática
Tarea informática
 
Djou Oct. 3
Djou Oct. 3Djou Oct. 3
Djou Oct. 3
 
Meio ambiente
Meio ambienteMeio ambiente
Meio ambiente
 
Deri rapport%20annuel fr.pdf
Deri rapport%20annuel fr.pdfDeri rapport%20annuel fr.pdf
Deri rapport%20annuel fr.pdf
 
P 9540
P 9540P 9540
P 9540
 
Modulo3
Modulo3Modulo3
Modulo3
 
Sortzen Topagunea: objetivos de la red
Sortzen Topagunea: objetivos de la redSortzen Topagunea: objetivos de la red
Sortzen Topagunea: objetivos de la red
 
Guia de apoyoqr
Guia de apoyoqrGuia de apoyoqr
Guia de apoyoqr
 
TECNOLOGIA
TECNOLOGIATECNOLOGIA
TECNOLOGIA
 
Semiomapping
SemiomappingSemiomapping
Semiomapping
 
Modulo1
Modulo1Modulo1
Modulo1
 
E:\Claude LéVi Strauss
E:\Claude LéVi StraussE:\Claude LéVi Strauss
E:\Claude LéVi Strauss
 
Etes vous prêts pour le Web 3.0
Etes vous prêts pour le Web 3.0Etes vous prêts pour le Web 3.0
Etes vous prêts pour le Web 3.0
 
Du web 2.0 au web 3.0 adbgv 8 juin 2010 montpellier
Du web 2.0 au web 3.0 adbgv 8 juin 2010 montpellierDu web 2.0 au web 3.0 adbgv 8 juin 2010 montpellier
Du web 2.0 au web 3.0 adbgv 8 juin 2010 montpellier
 
In-Memory Computing with SAP HANA™
In-Memory Computing with SAP HANA™In-Memory Computing with SAP HANA™
In-Memory Computing with SAP HANA™
 
Quantifying Social Selling - 2015 LinkedIn Sales Data
Quantifying Social Selling - 2015 LinkedIn Sales DataQuantifying Social Selling - 2015 LinkedIn Sales Data
Quantifying Social Selling - 2015 LinkedIn Sales Data
 
EJUN Finance Introduction - English
EJUN Finance Introduction - EnglishEJUN Finance Introduction - English
EJUN Finance Introduction - English
 
EECS 442 ckershaw presentation
EECS 442 ckershaw presentationEECS 442 ckershaw presentation
EECS 442 ckershaw presentation
 
Snapchat presentation karlrhen
Snapchat presentation karlrhenSnapchat presentation karlrhen
Snapchat presentation karlrhen
 

Similaire à Spring 3.0

Présentation de JavaServer Faces
Présentation de JavaServer FacesPrésentation de JavaServer Faces
Présentation de JavaServer Faces
JS Bournival
 
Java Database Connectivity
Java Database ConnectivityJava Database Connectivity
Java Database Connectivity
Korteby Farouk
 
Tester les applications Zend Framework
Tester les applications Zend FrameworkTester les applications Zend Framework
Tester les applications Zend Framework
Mickael Perraud
 
Patterns and OOP in PHP
Patterns and OOP in PHPPatterns and OOP in PHP
Patterns and OOP in PHP
julien pauli
 
Symfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 PerformantSymfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 Performant
Hugo Hamon
 
Jump Camp - HTML5
Jump Camp - HTML5Jump Camp - HTML5
Jump Camp - HTML5
chaudavid
 
Applets
AppletsApplets
Quelle place pour le framework Rails dans le développement d'application web
Quelle place pour le framework Rails dans le développement d'application webQuelle place pour le framework Rails dans le développement d'application web
Quelle place pour le framework Rails dans le développement d'application web
5pidou
 
BordeauxJUG : Portails &amp; Portlets Java
BordeauxJUG : Portails &amp; Portlets JavaBordeauxJUG : Portails &amp; Portlets Java
BordeauxJUG : Portails &amp; Portlets Java
Camblor Frédéric
 
ACRA - Présentation PAUG Avril 2011
ACRA - Présentation PAUG Avril 2011ACRA - Présentation PAUG Avril 2011
ACRA - Présentation PAUG Avril 2011
Kevin Gaudin
 
Utilisation de ZK avec Java - Retour d’expérience
Utilisation de ZK avec Java - Retour d’expérienceUtilisation de ZK avec Java - Retour d’expérience
Utilisation de ZK avec Java - Retour d’expérience
louschwartz
 
PHP 5.3, PHP Next
PHP 5.3, PHP NextPHP 5.3, PHP Next
PHP 5.3, PHP Next
SQLI
 
Quoi de neuf dans Zend Framework 1.10 ?
Quoi de neuf dans Zend Framework 1.10 ?Quoi de neuf dans Zend Framework 1.10 ?
Quoi de neuf dans Zend Framework 1.10 ?
Mickael Perraud
 
REST JUG Toulouse 20100615
REST JUG Toulouse 20100615REST JUG Toulouse 20100615
REST JUG Toulouse 20100615
JUG Toulouse
 
Rich Desktop Applications
Rich Desktop ApplicationsRich Desktop Applications
Rich Desktop Applications
goldoraf
 
Migration PHP4-PHP5
Migration PHP4-PHP5Migration PHP4-PHP5
Migration PHP4-PHP5
julien pauli
 
Java 5, un bilan
Java 5,  un bilanJava 5,  un bilan
Java 5, un bilan
teejug
 
Java 5, un blian
Java 5, un blianJava 5, un blian
Java 5, un blian
tareq
 

Similaire à Spring 3.0 (20)

Présentation de JavaServer Faces
Présentation de JavaServer FacesPrésentation de JavaServer Faces
Présentation de JavaServer Faces
 
Presentation JPA
Presentation JPAPresentation JPA
Presentation JPA
 
Java Database Connectivity
Java Database ConnectivityJava Database Connectivity
Java Database Connectivity
 
Tester les applications Zend Framework
Tester les applications Zend FrameworkTester les applications Zend Framework
Tester les applications Zend Framework
 
Patterns and OOP in PHP
Patterns and OOP in PHPPatterns and OOP in PHP
Patterns and OOP in PHP
 
Symfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 PerformantSymfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 Performant
 
Jump Camp - HTML5
Jump Camp - HTML5Jump Camp - HTML5
Jump Camp - HTML5
 
Applets
AppletsApplets
Applets
 
Quelle place pour le framework Rails dans le développement d'application web
Quelle place pour le framework Rails dans le développement d'application webQuelle place pour le framework Rails dans le développement d'application web
Quelle place pour le framework Rails dans le développement d'application web
 
BordeauxJUG : Portails &amp; Portlets Java
BordeauxJUG : Portails &amp; Portlets JavaBordeauxJUG : Portails &amp; Portlets Java
BordeauxJUG : Portails &amp; Portlets Java
 
ACRA - Présentation PAUG Avril 2011
ACRA - Présentation PAUG Avril 2011ACRA - Présentation PAUG Avril 2011
ACRA - Présentation PAUG Avril 2011
 
Utilisation de ZK avec Java - Retour d’expérience
Utilisation de ZK avec Java - Retour d’expérienceUtilisation de ZK avec Java - Retour d’expérience
Utilisation de ZK avec Java - Retour d’expérience
 
PHP 5.3, PHP Next
PHP 5.3, PHP NextPHP 5.3, PHP Next
PHP 5.3, PHP Next
 
Quoi de neuf dans Zend Framework 1.10 ?
Quoi de neuf dans Zend Framework 1.10 ?Quoi de neuf dans Zend Framework 1.10 ?
Quoi de neuf dans Zend Framework 1.10 ?
 
REST JUG Toulouse 20100615
REST JUG Toulouse 20100615REST JUG Toulouse 20100615
REST JUG Toulouse 20100615
 
Rich Desktop Applications
Rich Desktop ApplicationsRich Desktop Applications
Rich Desktop Applications
 
Migration PHP4-PHP5
Migration PHP4-PHP5Migration PHP4-PHP5
Migration PHP4-PHP5
 
iTunes Stats
iTunes StatsiTunes Stats
iTunes Stats
 
Java 5, un bilan
Java 5,  un bilanJava 5,  un bilan
Java 5, un bilan
 
Java 5, un blian
Java 5, un blianJava 5, un blian
Java 5, un blian
 

Spring 3.0

  • 1. Spring User Group France Spring 3.0 Arnaud Cogoluègnes 25/02/2010
  • 2. Agenda Un peu d'histoire...
  • 3. Les nouveautés de Spring 3.0 Java 5, Expression Language, REST, etc. So what?
  • 5. Speaker Arnaud Cogoluègnes Consultant chez Zenika
  • 7. Certifié « Spring Core » et formateur certifié SpringSource
  • 8. 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
  • 9. Agenda Un peu d'histoire...
  • 10. Les nouveautés de Spring 3.0 Java 5, Expression Language, REST, etc. So what?
  • 12. Un peu d'histoire v. 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 peu d'histoire... Les différentes version de Spring Les nouveautés de Spring 3.0 Java 5, Expression Language, REST, etc. So what?
  • 25. Divers Base de données embarquées
  • 26. Support JSR-330 « Dependency Injection for Java »
  • 27. Validation avec JSR-303 « Bean Validation »
  • 28. Configuration 100% Java Les parties dépréciées et supprimées
  • 29. 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
  • 30. Événement du contexte (ApplicationListener)
  • 31. Extensions du conteneur lé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
  • 37. etc.
  • 38. 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
  • 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 dans les projets du portfolio
  • 42. API pour intégrer le SpEL dans une application
  • 43. 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; (...) }
  • 44. 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
  • 45. 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...
  • 46. 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 );
  • 47. SpEL / quand utiliser ? A utiliser pour faciliter la configuration XML ou annotation Permet d'implémenter de la logique de configuration aisément
  • 48. Ne pas en abuser ! (pas de logique métier)
  • 49. SpEL / variables Des variables sont disponibles dans un contexte Spring systemProperties
  • 51. Nom de chaque bean Spring du contexte
  • 54. 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
  • 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 / 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 »
  • 57. 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é
  • 58. 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>
  • 59. 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)
  • 61. JSON Un support client pour consommer des services REST
  • 62. Support REST Qu'est-ce que REST ? Un style d'architecture
  • 63. Pour les systèmes distribués
  • 64. Exclusivement basé sur HTTP Orienté « ressource » Une URI = une ressource
  • 65. Utiliser les opérations de HTTP (GET, POST, PUT...) Utilisation des médias de HTTP HTML, XML, JSON, etc.
  • 66. Support REST / contrôleur @Controller public class ContactController { @Autowired private ContactService contactService ; @RequestMapping (value= &quot;/contacts/{id}&quot; ,method=RequestMethod. GET ) public ModelAndView read( @PathVariable Long id) throws Exception { Contact contact = contactService .get(id); return new ModelAndView( &quot;default&quot; ).addObject(contact); } } URI template ex. : http://localhost:8080/contact/services/contacts/1 Binding avec @PathVariable Opération HTTP GET Génération de la vue Spring MVC « classique »
  • 67. REST / configuration contrôleur Configuration Spring MVC classique
  • 68. Marshalling avec XStream Intégré dans Spring OXM < bean class = &quot;org.springframework.web.servlet.view.BeanNameViewResolver&quot; /> < bean id = &quot;default&quot; class = &quot;org.springframework.web.servlet.view.xml.MarshallingView&quot; > < property name = &quot;marshaller&quot; ref = &quot;marshaller&quot; /> </ bean > < bean id = &quot;marshaller&quot; class = &quot;org.springframework.oxm.xstream.XStreamMarshaller&quot; > < property name = &quot;aliases&quot; > < map > < entry key = &quot;contact&quot; value = &quot;com.zenika.contact.domaine.Contact&quot; /> </ map > </ bean >
  • 70. REST / coté client, RestTemplate Le RestTemplate permet d'accéder à des services REST
  • 71. Même philosophie que l'accès aux données Spring JdbcTemplate, JmsTemplate, etc.
  • 72. REST / RestTemplate Accéder à notre contrôleur REST Note : le RestTemplate n'est pas limité aux services REST de Spring ! RestTemplate restTemplate = new RestTemplate(); String res = restTemplate.getForObject( &quot;http://localhost:8080/contact/services/contacts/{id}&quot; , String. class , &quot;1&quot; ); URI template et arguments <contact> <id>1</id> <nom>Cogoluegnes</nom> <prenom>Arnaud</prenom> </contact> Contenu de la Variable “res&quot;
  • 73. REST / RestTemplate Comment traiter la réponse ? Chaîne de caractères peu commode à exploiter Le RestTemplate utilise des HttpMessageConverter Pour une conversion réponse HTTP / objet Java
  • 74. REST / convertisseur réponse / contact public class ContactHttpMessageConverter implements HttpMessageConverter<Contact> { public Contact read(Class<? extends Contact> clazz, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException { XStream xstream = new XStream(); xstream.alias( &quot;contact&quot; , Contact. class ); return (Contact) xstream.fromXML(inputMessage.getBody()); } public void write(Contact contact, MediaType contentType, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException { XStream xstream = new XStream(); xstream.alias( &quot;contact&quot; , Contact. class ); xstream.toXML(contact, outputMessage.getBody()); } public boolean canRead(Class<?> clazz, MediaType mediaType) { return Contact. class .isAssignableFrom(clazz); } public boolean canWrite(Class<?> clazz, MediaType mediaType) { return Contact. class .isAssignableFrom(clazz); } public List<MediaType> getSupportedMediaTypes() { return Arrays. asList ( new MediaType( &quot;application&quot; , &quot;xml&quot; ), new MediaType( &quot;text&quot; , &quot;xml&quot; )); } }
  • 75. REST / conversion automatique Le convertisseur est utilisé en fonction la classe de retour demandée Contact contact = restTemplate.getForObject( &quot;http://localhost:8080/contact/services/contacts/{id}&quot; , Contact. class , &quot;1&quot; );
  • 76. REST / convertisseur XML Spring fournit des convertisseurs prêts à l'usage
  • 77. ex. : convertisseur XML < bean class = &quot;org.springframework.web.client.RestTemplate&quot; > < property name = &quot;messageConverters&quot; > < list > < bean class = &quot; org.springframework.http.converter.xml.MarshallingHttpMessageConverter&quot; > < property name = &quot;marshaller&quot; ref = &quot;marshaller&quot; /> < property name = &quot;unmarshaller&quot; ref = &quot;marshaller&quot; /> </ bean > </ list > </ property > </ bean >
  • 78. REST / Opérations HTTP @Controller public class ContactController { @RequestMapping (value= &quot;/contacts/&quot; ,method=RequestMethod. PUT ) public ModelAndView create( @RequestBody Contact contact) throws Exception { contact = contactService .create(contact); return new ModelAndView( &quot;default&quot; ).addObject(contact); } } Contact contact = new Contact(29L, &quot;Doe&quot; , &quot;John&quot; ); restTemplate .put( &quot;http://localhost:8080/contact/services/contacts/&quot; ,contact); Opération HTTP PUT HttpMessageConverter utilisé coté client Opération HTTP PUT HttpMessageConverter utilisé coté serveur (@RequestBody)
  • 79. REST / bonus :) HttpMessageConverter sur le contrôleur Plus de rendu de vue à la Spring MVC
  • 80. @RequestBody Ex. d'utilisation du support REST sur le blog de Zenika : http://blog.zenika.com/index.php?post/2009/12/23/REST-avec-Spring-3.0-et-Solr @Controller public class ContactController { @RequestMapping (value= &quot;/contactsl/{id}&quot; ,method=RequestMethod. GET ) @ResponseBody public Contact get( @PathVariable Long id) throws Exception { return contactService .get(id); } }
  • 81. Scheduling Abstraction pour du scheduling API + namespace Permet de déléguer à Spring des tâches planifiées
  • 82. Spring peut Gérer l'infrastructure (thread & co)
  • 83. Se brancher sur une infrastructure existante ex. : CommonJ
  • 84. Scheduling / API API plus simple que java.util.concurrent public class SomeTask implements Runnable { @Override public void run() { … } } ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler(); scheduler.afterPropertiesSet(); scheduler.schedule( new SomeTask(), dateLancement); scheduler.scheduleAtFixedRate( new SomeTask(), 60 * 1000); scheduler.schedule( new SomeTask(), new CronTrigger( &quot;0 0 23 ? * MON-FRI&quot; ) );
  • 85. Scheduling / namespace XML Pour les besoins courants, préférer le namespace à l'API
  • 86. Spring gère la configuration Taille du pool de threads, file d'attente, etc.
  • 87. lancement/arrêt du scheduler Déclaratif, modèle POJO
  • 88. Scheduling / namespace < bean id = &quot;batchService&quot; class = &quot;com.zenika.scheduling.BatchServiceImpl&quot; /> < task:scheduler id = &quot;scheduler&quot; pool-size = &quot;10&quot; /> < task:scheduled-tasks scheduler = &quot;scheduler&quot; > < task:scheduled ref = &quot;batchService&quot; method = &quot;importFactures&quot; fixed-rate = &quot;86400000&quot; /> < task:scheduled ref = &quot;batchService&quot; method = &quot;constructionIndex&quot; cron = &quot;0 0 23 ? * MON-FRI&quot; /> </ task:scheduled-tasks > public class BatchServiceImpl { public void importFactures() { … } public void constructionIndex() { … } } 24 heures
  • 89. Scheduling / namespace < bean id = &quot;batchService&quot; class = &quot;com.zenika.scheduling.BatchServiceImpl&quot; /> < task:scheduler id = &quot;scheduler&quot; pool-size = &quot;10&quot; /> < task:scheduled-tasks scheduler = &quot;scheduler&quot; > < task:scheduled ref = &quot;batchService&quot; method = &quot;importFactures&quot; fixed-rate = &quot;#{24*60*60*1000}&quot; /> < task:scheduled ref = &quot;batchService&quot; method = &quot;constructionIndex&quot; cron = &quot;0 0 23 ? * MON-FRI&quot; /> </ task:scheduled-tasks > public class BatchServiceImpl { public void importFactures() { … } public void constructionIndex() { … } } SpEL !
  • 90. Scheduling / Annotations public class BatchServiceImpl { @Scheduled (fixedRate=60*60*1000) public void nettoyageCache() { … } @Scheduled (cron= &quot;0 0 23 ? * MON-FRI&quot; ) public void liberationVerrousFantomes() { … } } < task:annotation-driven /> < task:annotation-driven scheduler = &quot;scheduler&quot; />
  • 91. Scheduling / asynchrone Possibilité d'effectuer des appels asynchrones
  • 92. Tâches appropriées : Traitement long, envoi d'emails, etc. public class NotificationServiceImpl implements NotificationService { @Async public void notificationEmail(String to) { … } } < task:annotation-driven />
  • 93. Scheduling / Asynchrone Appel client Retour Appel client Retour immédiat Synchrone Asynchrone Intercepteur Cible Cible
  • 94. Scheduling / Asynchrone L'asynchrone devient transverse
  • 95. Support léger « out of the box »
  • 98. Directement utilisable dans les applications
  • 99. Bases pour des projets du portfolio Spring Batch, Spring Integration
  • 100. Divers / Base de données embarquées Création de DataSource en mémoire
  • 101. Passage de scripts SQL < jdbc:embedded-database id = &quot;dataSource&quot; /> < jdbc:embedded-database id = &quot;dataSource&quot; > < jdbc:script location = &quot;classpath:create_table.sql&quot; /> < jdbc:script location = &quot;classpath:insert_data.sql&quot; /> </ jdbc:embedded-database > < jdbc:embedded-database id = &quot;dataSourceHsql&quot; type = &quot;HSQL&quot; /> < jdbc:embedded-database id = &quot;dataSourceH2&quot; type = &quot;H2&quot; /> < jdbc:embedded-database id = &quot;dataSourceDerby&quot; type = &quot;DERBY&quot; />
  • 102. Divers / JSR-330 Support pour JSR-330 « Dependency injection for Java » Standardisation de @Qualifier Résolution des ambiguïtés en autowiring public class MyService { @ Inject private MyDao myDao ; ... }
  • 103. Divers / Configuration Java Les méta-données de configuration des beans sont en Java @ Configuration public class BusinessConfiguration { @ Bean @ Scope(value= &quot;session&quot; ,proxyMode=ScopedProxyMode.INTERFACES) public InfoUtilisateur infoUtilisateur() { return new InfoUtilisateurImpl(); } @ Bean public BusinessService businessService() { BusinessServiceImpl service = new BusinessServiceImpl(); service.setInfoUtilisateur(infoUtilisateur()); return service; } }
  • 104. Divers / JSR-303 Validation déclarative avec la JSR-303 Intégration dans Spring MVC Support des annotations de validation @NotNull, @Size Déclenchement de la validation avec @Valid
  • 105. Divers / JSR-303 public class Contact { @ NotNull @ Size(min=1,max=50) private String nom ; @ NotNull @ Size(min=1,max=50) private String prenom; ... } @ Controller public class MainController { @ RequestMapping(value= &quot;/main.do&quot; , method=RequestMethod.POST) public ModelAndView submit( @ Valid Contact ctc, BindingResult bindingResult) { if (bindingResult.hasErrors()) { // gestion des erreurs de validation ... } } }
  • 106. Parties dépréciées et supprimées Dépréciées Hiérarchie de contrôleur Web
  • 107. Hiérarchie de classes JUnit 3.8 Supprimées Support Commons Attributes
  • 109. 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?
  • 111. So what? Qu'apporte Spring 3.0 ? Framework arrive à maturité
  • 112. Modèle de configuration varié (XML, annotation, Java), mais toujours cohérent Conduit mais aussi suit les tendances Support REST, conf. Java/annotation type-safe, support de Java EE 6
  • 113. So what? Configurations Portabilité d'un serveur à l'autre
  • 114. Portable pour différentes génération de Java EE J2EE 1.4, Java EE 5 & 6 v. 2, v. 3 v. 4, v. 5, v. 6 v. 5, v. 6, v. 7 v. 5.0, v. 5.5, v. 6.0
  • 115. So what? configurations Support partiel de Java EE 6
  • 116. Utiliser Java EE 6 sur un serveur/conteneur Web J2EE 1.4 ou Java EE 5 v. 5.0, v. 5.5, v. 6.0 JPA 2.0
  • 117. So what? Migrer vers Spring 3.0 Spring 3.0 est 99,99 % compatible avec Spring 2.5 JAR « drop-in » Quelques erreurs de compilation possibles Transtypage applicatif / passage aux génériques Les projets du portfolio sont généralement testés sur Spring 2.5 ET Spring 3.0
  • 118. So what? Roadmap Spring 3.1 courant 2010 Support pour Java EE 6 Projets du portfolio vont s'aligner sur Spring 3.0 Et exploiter les nouveautés Idem pour la « plateforme » dm Server/Virgo, SpringSource Tool Suite, Grails, etc.
  • 119. 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?
  • 121. Conclusion Spring 3.0 = passage à maturité du framework Évolution du modèle de composants
  • 123. Portabilité Plus seulement un framework applicatif...
  • 124. … une plateforme Pour un ensemble de projets
  • 125. Pour du middleware (ex. : OSGi)
  • 127. Merci de votre attention ! Tirage au sort pour 2 exemplaires de Spring par la pratique V2 !