Spring 3.0
Upcoming SlideShare
Loading in...5
×

Like this? Share it with your network

Share
Uploaded on

Présentation de Spring 3.0 au Spring User Group France

Présentation de Spring 3.0 au Spring User Group France

  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
4,426
On Slideshare
4,415
From Embeds
11
Number of Embeds
1

Actions

Shares
Downloads
186
Comments
0
Likes
1

Embeds 11

http://www.slideshare.net 11

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 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?
    • 4. Conclusion
  • 5. Speaker
    • Arnaud Cogoluègnes
      • Consultant chez Zenika
      • 6. Utilise Spring depuis 2005
      • 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?
    • 11. Conclusion
  • 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?
    • 20. Conclusion
  • 21. Nouveautés Spring 3.0
    • Java 5
    • 22. Spring Expression Language
    • 23. Support REST
    • 24. Scheduling
    • 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
  • 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 '^-?+({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
      • 50. systemEnvironment
      • 51. Nom de chaque bean Spring du contexte
      • 52. request (Web)
      • 53. session (Web)
  • 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)
      • 60. Atom et RSS
      • 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 >
  • 69. REST / résultat
  • 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 »
    • 96. Paramétrable (XML/annotation, CRON)
    • 97. Bonne testabilité
    • 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
      • 108. Support TopLink
  • 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?
    • 110. Conclusion
  • 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?
    • 120. Conclusion
  • 121. Conclusion
    • Spring 3.0 = passage à maturité du framework
      • Évolution du modèle de composants
      • 122. Support de standards
      • 123. Portabilité
    • Plus seulement un framework applicatif...
    • 124. … une plateforme
      • Pour un ensemble de projets
      • 125. Pour du middleware (ex. : OSGi)
  • 126. Agenda
    • Questions ?
  • 127. Merci de votre attention !
    • Tirage au sort pour 2 exemplaires de Spring par la pratique V2 !