SlideShare uma empresa Scribd logo
1 de 63
Spring User Group France ,[object Object]
Agenda ,[object Object]
Les nouveautés de Spring 3.0 ,[object Object],[object Object]
Conclusion
Speaker ,[object Object]
Utilise Spring depuis 2005
Certifié « Spring Core » et formateur certifié SpringSource
Co-auteur : ,[object Object],[object Object],acogoluegnes
Agenda ,[object Object]
Les nouveautés de Spring 3.0 ,[object Object],[object Object]
Conclusion
Un peu d'histoire ,[object Object]
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 ,[object Object]
Conclusion
Nouveautés Spring 3.0 ,[object Object]
Spring Expression Language
Support REST
Scheduling
Divers ,[object Object]
Support JSR-330 « Dependency Injection for Java »
Validation avec JSR-303 « Bean Validation »
Configuration 100% Java ,[object Object]
Java 5 ,[object Object]
É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 ,[object Object]
ApplicationListener
etc.
Java 5 ,[object Object]
Spring Expression Language (SpEL) ,[object Object]
Dans des JSP (<spring:eval>)
Va arriver dans les projets du portfolio
API pour intégrer le SpEL dans une application
SpEL / Configuration ,[object Object],[object Object],< 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 ,[object Object],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 ? ,[object Object]
Ne pas en abuser ! (pas de logique métier)
SpEL / variables ,[object Object]
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 ,[object Object],< 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 ,[object Object],@ 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 ,[object Object],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 ,[object Object]
Atom et RSS
JSON ,[object Object]
Support REST ,[object Object]
Pour les systèmes distribués

Mais conteúdo relacionado

Mais procurados

Introduction à spring boot
Introduction à spring bootIntroduction à spring boot
Introduction à spring bootAntoine Rey
 
Workshop Spring - Session 5 - Spring Integration
Workshop Spring - Session 5 - Spring IntegrationWorkshop Spring - Session 5 - Spring Integration
Workshop Spring - Session 5 - Spring IntegrationAntoine Rey
 
Architecture java j2 ee a partager
Architecture java j2 ee a partagerArchitecture java j2 ee a partager
Architecture java j2 ee a partageraliagadir
 
Workshop Spring - Session 4 - Spring Batch
Workshop Spring -  Session 4 - Spring BatchWorkshop Spring -  Session 4 - Spring Batch
Workshop Spring - Session 4 - Spring BatchAntoine 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émeAlgeria 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 JavaAntoine Rey
 
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 - mvcFlorent 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 BootDNG Consulting
 
Retours Devoxx France 2016
Retours Devoxx France 2016Retours Devoxx France 2016
Retours Devoxx France 2016Antoine Rey
 
Prsentation de-javaserver-faces4124
Prsentation de-javaserver-faces4124Prsentation de-javaserver-faces4124
Prsentation de-javaserver-faces4124Mejdeddine Bouzouita
 
Formation jpa-hibernate-spring-data
Formation jpa-hibernate-spring-dataFormation jpa-hibernate-spring-data
Formation jpa-hibernate-spring-dataLhouceine OUHAMZA
 
Aspect avec AspectJ
Aspect avec AspectJAspect avec AspectJ
Aspect avec AspectJsimeon
 
Tech Days Spring Intégration
Tech Days Spring IntégrationTech Days Spring Intégration
Tech Days Spring IntégrationArrow-Institute
 

Mais procurados (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
 

Destaque

Modulo3
Modulo3Modulo3
Modulo3cefic
 
Sortzen Topagunea: objetivos de la red
Sortzen Topagunea: objetivos de la redSortzen Topagunea: objetivos de la red
Sortzen Topagunea: objetivos de la redSortzen Urola Garaian
 
Modulo1
Modulo1Modulo1
Modulo1cefic
 
E:\Claude LéVi Strauss
E:\Claude LéVi StraussE:\Claude LéVi Strauss
E:\Claude LéVi Straussali169
 
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.0Kamel 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 montpellierFranck 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 DataKatie Yrazabal Baudler
 
EECS 442 ckershaw presentation
EECS 442 ckershaw presentationEECS 442 ckershaw presentation
EECS 442 ckershaw presentationckershawumich
 
Snapchat presentation karlrhen
Snapchat presentation karlrhenSnapchat presentation karlrhen
Snapchat presentation karlrhenKarl Henderson
 

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

Semelhante a Spring 3.0

Présentation de JavaServer Faces
Présentation de JavaServer FacesPrésentation de JavaServer Faces
Présentation de JavaServer FacesJS Bournival
 
Java Database Connectivity
Java Database ConnectivityJava Database Connectivity
Java Database ConnectivityKorteby Farouk
 
Tester les applications Zend Framework
Tester les applications Zend FrameworkTester les applications Zend Framework
Tester les applications Zend FrameworkMickael Perraud
 
Patterns and OOP in PHP
Patterns and OOP in PHPPatterns and OOP in PHP
Patterns and OOP in PHPjulien pauli
 
Symfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 PerformantSymfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 PerformantHugo Hamon
 
Jump Camp - HTML5
Jump Camp - HTML5Jump Camp - HTML5
Jump Camp - HTML5chaudavid
 
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 web5pidou
 
BordeauxJUG : Portails &amp; Portlets Java
BordeauxJUG : Portails &amp; Portlets JavaBordeauxJUG : Portails &amp; Portlets Java
BordeauxJUG : Portails &amp; Portlets JavaCamblor 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 2011Kevin 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ériencelouschwartz
 
PHP 5.3, PHP Next
PHP 5.3, PHP NextPHP 5.3, PHP Next
PHP 5.3, PHP NextSQLI
 
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 20100615JUG Toulouse
 
Rich Desktop Applications
Rich Desktop ApplicationsRich Desktop Applications
Rich Desktop Applicationsgoldoraf
 
Migration PHP4-PHP5
Migration PHP4-PHP5Migration PHP4-PHP5
Migration PHP4-PHP5julien pauli
 
Java 5, un blian
Java 5, un blianJava 5, un blian
Java 5, un bliantareq
 
Java 5, un bilan
Java 5,  un bilanJava 5,  un bilan
Java 5, un bilanteejug
 

Semelhante a 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 blian
Java 5, un blianJava 5, un blian
Java 5, un blian
 
Java 5, un bilan
Java 5,  un bilanJava 5,  un bilan
Java 5, un bilan
 

Spring 3.0

  • 1.
  • 2.
  • 3.
  • 5.
  • 7. Certifié « Spring Core » et formateur certifié SpringSource
  • 8.
  • 9.
  • 10.
  • 12.
  • 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.
  • 21.
  • 25.
  • 26. Support JSR-330 « Dependency Injection for Java »
  • 27. Validation avec JSR-303 « Bean Validation »
  • 28.
  • 29.
  • 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.
  • 37. etc.
  • 38.
  • 39.
  • 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.
  • 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.
  • 47.
  • 48. Ne pas en abuser ! (pas de logique métier)
  • 49.
  • 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.
  • 57.
  • 58.
  • 59.
  • 61.
  • 62.
  • 63. Pour les systèmes distribués
  • 64.
  • 65.
  • 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.
  • 68.
  • 70.
  • 71.
  • 72.
  • 73.
  • 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.
  • 76.
  • 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.
  • 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.
  • 82.
  • 83.
  • 84.
  • 85.
  • 86.
  • 87.
  • 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.
  • 92.
  • 93. Scheduling / Asynchrone Appel client Retour Appel client Retour immédiat Synchrone Asynchrone Intercepteur Cible Cible
  • 94.
  • 95. Support léger « out of the box »
  • 98. Directement utilisable dans les applications
  • 99.
  • 100.
  • 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.
  • 103.
  • 104.
  • 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.
  • 107.
  • 109.
  • 111.
  • 112.
  • 113.
  • 114.
  • 115.
  • 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.
  • 118.
  • 119.
  • 121.
  • 123.
  • 124.
  • 125. Pour du middleware (ex. : OSGi)
  • 126.
  • 127.