0
Spring User Group France <ul>Spring 3.0 Arnaud Cogoluègnes 25/02/2010 </ul>
Agenda <ul><li>Un peu d'histoire...
Les nouveautés de Spring 3.0 </li><ul><li>Java 5, Expression Language, REST, etc. </li></ul><li>So what?
Conclusion </li></ul>
Speaker <ul><li>Arnaud Cogoluègnes </li><ul><li>Consultant chez Zenika
Utilise Spring depuis 2005
Certifié « Spring Core » et formateur certifié SpringSource
Co-auteur : </li></ul></ul><ul>Spring par la pratique 2nde édition </ul><ul>Spring Dynamic Modules in Action Manning Editi...
Agenda <ul><li>Un peu d'histoire...
Les nouveautés de Spring 3.0 </li><ul><li>Java 5, Expression Language, REST, etc. </li></ul><li>So what?
Conclusion </li></ul>
Un peu d'histoire <ul><li>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 </li></ul>
Agenda <ul><li>Un peu d'histoire... </li><ul><li>Les différentes version de Spring </li></ul><li>Les nouveautés de Spring ...
Conclusion </li></ul>
Nouveautés Spring 3.0 <ul><li>Java 5
Spring Expression Language
Support REST
Scheduling
Divers </li><ul><li>Base de données embarquées
Support JSR-330 « Dependency Injection for Java »
Validation avec JSR-303 « Bean Validation »
Configuration 100% Java </li></ul><li>Les parties dépréciées et supprimées </li></ul>
Java 5 <ul><li>Toute l'API de Spring tire profit de Java </li><ul><li>varargs, générique </li></ul><li>Modules « visibles ...
Événement du contexte (ApplicationListener)
Extensions du conteneur léger (FactoryBean) </li></ul></ul>
Java 5 / JDBC public   class  ContactRowMapper  implements  RowMapper<Contact> { @Override public  Contact mapRow(ResultSe...
Java 5 / Hibernate Contact contact = hibTpl.get(Contact. class , id); (...) contact = hibTpl.execute( new  HibernateCallba...
Java 5 / Transaction TransactionTemplate trTemplate = (...) int  nbBatch = (...) for ( int  i=0;i<nbBatch;i++) { Contact c...
Java 5 / le reste <ul><li>Sans oublier les points d'extension </li><ul><li>FactoryBean
ApplicationListener
etc. </li></ul></ul>
Java 5 <ul><li>Peu d'impact sur le code applicatif </li><ul><li>Spring n'est pas censé être intrusif </li></ul><li>Plus d'...
Spring Expression Language (SpEL) <ul><li>Quoi ? Un langage d'expressions </li><ul><li>Du type Unified EL, OGNL </li></ul>...
Dans des JSP (<spring:eval>)
Va arriver dans les projets du portfolio
API pour intégrer le SpEL dans une application </li></ul></ul>
SpEL / Configuration <ul><li>Dans un fichier XML : </li></ul><ul><li>Avec une annotation : </li></ul>< bean   id = &quot;t...
SpEL / Syntaxe Syntaxe Type someTable[2] tableau someMap['someKey'] map contact.prenom  propriété contact.Prenom propriété...
SpEL / Syntaxe Syntaxe Type '5.00' matches '^-?+({2})?$' regex isMember('Nikola Tesla') and isMember('Mihajlo Pupin') opér...
SpEL / API <ul><li>Simple à embarquer dans une application : </li></ul>ExpressionParser parser =  new  SpelExpressionParse...
SpEL / quand utiliser ? <ul><li>A utiliser pour faciliter la configuration </li><ul><li>XML ou annotation </li></ul><li>Pe...
Ne pas en abuser ! (pas de logique métier) </li></ul>
SpEL / variables <ul><li>Des variables sont disponibles dans un contexte Spring </li><ul><li>systemProperties
systemEnvironment
Nom de chaque bean Spring du contexte
request (Web)
session (Web) </li></ul></ul>
SpEL / configuration multi-environnements < bean class = &quot;org.springframework.beans.factory.config. PropertyPlacehold...
SpEL / scope & variable public   interface  ContactService { List<Contact> getContactsPrivilegies(Long idUser); } < bean  ...
SpEL / Spring Security <ul><li>Sécuriser une URL </li></ul>< http   use-expressions = &quot;true&quot; > < intercept-url  ...
SpEL / Spring Security <ul><li>Sécuriser des appels de méthodes </li></ul>@ PreAuthorize( &quot;hasRole('ROLE_USER')&quot;...
SpEL / Spring Batch <ul><li>Rendre la configuration plus dynamique </li></ul>JobParameters jobParameters =  new  JobParame...
Support REST <ul><li>Spring MVC « Service Oriented » </li><ul><li>Quelques annotations pour un contrôleur REST </li></ul><...
Atom et RSS
JSON </li></ul><li>Un support client pour consommer des services REST </li></ul>
Support REST <ul><li>Qu'est-ce que REST ? </li><ul><li>Un style d'architecture
Pour les systèmes distribués
Upcoming SlideShare
Loading in...5
×

Spring 3.0

3,541

Published on

Présentation de Spring 3.0 au Spring User Group France

0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
3,541
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
198
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Transcript of "Spring 3.0"

  1. 1. Spring User Group France <ul>Spring 3.0 Arnaud Cogoluègnes 25/02/2010 </ul>
  2. 2. Agenda <ul><li>Un peu d'histoire...
  3. 3. Les nouveautés de Spring 3.0 </li><ul><li>Java 5, Expression Language, REST, etc. </li></ul><li>So what?
  4. 4. Conclusion </li></ul>
  5. 5. Speaker <ul><li>Arnaud Cogoluègnes </li><ul><li>Consultant chez Zenika
  6. 6. Utilise Spring depuis 2005
  7. 7. Certifié « Spring Core » et formateur certifié SpringSource
  8. 8. Co-auteur : </li></ul></ul><ul>Spring par la pratique 2nde édition </ul><ul>Spring Dynamic Modules in Action Manning Editions http://manning.com/cogoluegnes A paraître mi 2010 </ul>acogoluegnes
  9. 9. Agenda <ul><li>Un peu d'histoire...
  10. 10. Les nouveautés de Spring 3.0 </li><ul><li>Java 5, Expression Language, REST, etc. </li></ul><li>So what?
  11. 11. Conclusion </li></ul>
  12. 12. Un peu d'histoire <ul><li>v. 0.9 : juin 2003 (toutes les bases)
  13. 13. v. 1.0 : mars 2004
  14. 14. v. 1.1 : septembre 2004
  15. 15. v. 1.2 : mai 2005
  16. 16. v. 2.0 : octobre 2006 (namespaces XML)
  17. 17. v. 2.5 : novembre 2007 (annotations)
  18. 18. v. 3.0 : décembre 2009 </li></ul>
  19. 19. Agenda <ul><li>Un peu d'histoire... </li><ul><li>Les différentes version de Spring </li></ul><li>Les nouveautés de Spring 3.0 </li><ul><li>Java 5, Expression Language, REST, etc. </li></ul><li>So what?
  20. 20. Conclusion </li></ul>
  21. 21. Nouveautés Spring 3.0 <ul><li>Java 5
  22. 22. Spring Expression Language
  23. 23. Support REST
  24. 24. Scheduling
  25. 25. Divers </li><ul><li>Base de données embarquées
  26. 26. Support JSR-330 « Dependency Injection for Java »
  27. 27. Validation avec JSR-303 « Bean Validation »
  28. 28. Configuration 100% Java </li></ul><li>Les parties dépréciées et supprimées </li></ul>
  29. 29. Java 5 <ul><li>Toute l'API de Spring tire profit de Java </li><ul><li>varargs, générique </li></ul><li>Modules « visibles » affectés </li><ul><li>Accès aux données : JDBC, Hibernate, transaction
  30. 30. Événement du contexte (ApplicationListener)
  31. 31. Extensions du conteneur léger (FactoryBean) </li></ul></ul>
  32. 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. 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. 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. 35. Java 5 / le reste <ul><li>Sans oublier les points d'extension </li><ul><li>FactoryBean
  36. 36. ApplicationListener
  37. 37. etc. </li></ul></ul>
  38. 38. Java 5 <ul><li>Peu d'impact sur le code applicatif </li><ul><li>Spring n'est pas censé être intrusif </li></ul><li>Plus d'impact sur </li><ul><li>les API existantes et à venir </li><ul><li>ex. : conversion, binding dans 3.0 </li></ul><li>les projets du portfolio </li></ul></ul>
  39. 39. Spring Expression Language (SpEL) <ul><li>Quoi ? Un langage d'expressions </li><ul><li>Du type Unified EL, OGNL </li></ul><li>Pour ? Exprimer des concepts complexes </li><ul><li>De façon succincte </li></ul><li>Où ? </li><ul><li>Dans les fichiers de configuration Spring
  40. 40. Dans des JSP (<spring:eval>)
  41. 41. Va arriver dans les projets du portfolio
  42. 42. API pour intégrer le SpEL dans une application </li></ul></ul>
  43. 43. SpEL / Configuration <ul><li>Dans un fichier XML : </li></ul><ul><li>Avec une annotation : </li></ul>< 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. 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. 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. 46. SpEL / API <ul><li>Simple à embarquer dans une application : </li></ul>ExpressionParser parser = new SpelExpressionParser(); Expression exp = parser.parseExpression( &quot;'Hello World'&quot; ); String message = (String) exp.getValue(); (...) String message = exp.getValue(String. class );
  47. 47. SpEL / quand utiliser ? <ul><li>A utiliser pour faciliter la configuration </li><ul><li>XML ou annotation </li></ul><li>Permet d'implémenter de la logique de configuration aisément
  48. 48. Ne pas en abuser ! (pas de logique métier) </li></ul>
  49. 49. SpEL / variables <ul><li>Des variables sont disponibles dans un contexte Spring </li><ul><li>systemProperties
  50. 50. systemEnvironment
  51. 51. Nom de chaque bean Spring du contexte
  52. 52. request (Web)
  53. 53. session (Web) </li></ul></ul>
  54. 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. 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. 56. SpEL / Spring Security <ul><li>Sécuriser une URL </li></ul>< 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. 57. SpEL / Spring Security <ul><li>Sécuriser des appels de méthodes </li></ul>@ 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. 58. SpEL / Spring Batch <ul><li>Rendre la configuration plus dynamique </li></ul>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. 59. Support REST <ul><li>Spring MVC « Service Oriented » </li><ul><li>Quelques annotations pour un contrôleur REST </li></ul><li>Support de types de vues supplémentaires </li><ul><li>Spring OXM dans Spring Core (XML)
  60. 60. Atom et RSS
  61. 61. JSON </li></ul><li>Un support client pour consommer des services REST </li></ul>
  62. 62. Support REST <ul><li>Qu'est-ce que REST ? </li><ul><li>Un style d'architecture
  63. 63. Pour les systèmes distribués
  64. 64. Exclusivement basé sur HTTP </li></ul><li>Orienté « ressource » </li><ul><li>Une URI = une ressource
  65. 65. Utiliser les opérations de HTTP (GET, POST, PUT...) </li></ul><li>Utilisation des médias de HTTP </li><ul><li>HTML, XML, JSON, etc. </li></ul></ul>
  66. 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. 67. REST / configuration contrôleur <ul><li>Configuration Spring MVC classique
  68. 68. Marshalling avec XStream </li><ul><li>Intégré dans Spring OXM </li></ul></ul>< 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. 69. REST / résultat
  70. 70. REST / coté client, RestTemplate <ul><li>Le RestTemplate permet d'accéder à des services REST
  71. 71. Même philosophie que l'accès aux données Spring </li><ul><li>JdbcTemplate, JmsTemplate, etc. </li></ul></ul>
  72. 72. REST / RestTemplate <ul><li>Accéder à notre contrôleur REST </li><ul><li>Note : le RestTemplate n'est pas limité aux services REST de Spring ! </li></ul></ul>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. 73. REST / RestTemplate <ul><li>Comment traiter la réponse ? </li><ul><li>Chaîne de caractères peu commode à exploiter </li></ul><li>Le RestTemplate utilise des HttpMessageConverter </li><ul><li>Pour une conversion réponse HTTP / objet Java </li></ul></ul>
  74. 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. 75. REST / conversion automatique <ul><li>Le convertisseur est utilisé en fonction la classe de retour demandée </li></ul>Contact contact = restTemplate.getForObject( &quot;http://localhost:8080/contact/services/contacts/{id}&quot; , Contact. class , &quot;1&quot; );
  76. 76. REST / convertisseur XML <ul><li>Spring fournit des convertisseurs prêts à l'usage
  77. 77. ex. : convertisseur XML </li></ul>< 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. 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. 79. REST / bonus :) <ul><li>HttpMessageConverter sur le contrôleur </li><ul><li>Plus de rendu de vue à la Spring MVC
  80. 80. @RequestBody </li></ul></ul>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. 81. Scheduling <ul><li>Abstraction pour du scheduling </li><ul><li>API + namespace </li></ul><li>Permet de déléguer à Spring des tâches planifiées
  82. 82. Spring peut </li><ul><li>Gérer l'infrastructure (thread & co)
  83. 83. Se brancher sur une infrastructure existante </li><ul><li>ex. : CommonJ </li></ul></ul></ul>
  84. 84. Scheduling / API <ul><li>API plus simple que java.util.concurrent </li></ul>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. 85. Scheduling / namespace XML <ul><li>Pour les besoins courants, préférer le namespace à l'API
  86. 86. Spring gère la configuration </li><ul><li>Taille du pool de threads, file d'attente, etc.
  87. 87. lancement/arrêt du scheduler </li></ul><li>Déclaratif, modèle POJO </li></ul>
  88. 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. 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. 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. 91. Scheduling / asynchrone <ul><li>Possibilité d'effectuer des appels asynchrones
  92. 92. Tâches appropriées : </li><ul><li>Traitement long, envoi d'emails, etc. </li></ul></ul>public class NotificationServiceImpl implements NotificationService { @Async public void notificationEmail(String to) { … } } < task:annotation-driven />
  93. 93. Scheduling / Asynchrone Appel client Retour Appel client Retour immédiat Synchrone Asynchrone Intercepteur Cible Cible
  94. 94. Scheduling / Asynchrone <ul><li>L'asynchrone devient transverse
  95. 95. Support léger « out of the box »
  96. 96. Paramétrable (XML/annotation, CRON)
  97. 97. Bonne testabilité
  98. 98. Directement utilisable dans les applications
  99. 99. Bases pour des projets du portfolio </li><ul><li>Spring Batch, Spring Integration </li></ul></ul>
  100. 100. Divers / Base de données embarquées <ul><li>Création de DataSource en mémoire
  101. 101. Passage de scripts SQL </li></ul>< 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. 102. Divers / JSR-330 <ul><li>Support pour JSR-330 « Dependency injection for Java » </li></ul><ul><li>Standardisation de @Qualifier </li><ul><li>Résolution des ambiguïtés en autowiring </li></ul></ul>public class MyService { @ Inject private MyDao myDao ; ... }
  103. 103. Divers / Configuration Java <ul><li>Les méta-données de configuration des beans sont en Java </li></ul>@ 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. 104. Divers / JSR-303 <ul><li>Validation déclarative avec la JSR-303 </li><ul><li>Intégration dans Spring MVC </li></ul><li>Support des annotations de validation </li><ul><li>@NotNull, @Size </li></ul><li>Déclenchement de la validation avec @Valid </li></ul>
  105. 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. 106. Parties dépréciées et supprimées <ul><li>Dépréciées </li><ul><li>Hiérarchie de contrôleur Web
  107. 107. Hiérarchie de classes JUnit 3.8 </li></ul><li>Supprimées </li><ul><li>Support Commons Attributes
  108. 108. Support TopLink </li></ul></ul>
  109. 109. Agenda <ul><li>Un peu d'histoire... </li><ul><li>Les différentes version de Spring </li></ul><li>Les nouveautés de Spring 3.0 </li><ul><li>Java 5, Expression Language, REST, etc. </li></ul><li>So what?
  110. 110. Conclusion </li></ul>
  111. 111. So what? <ul><li>Qu'apporte Spring 3.0 ? </li><ul><li>Framework arrive à maturité
  112. 112. Modèle de configuration varié (XML, annotation, Java), mais toujours cohérent </li></ul><li>Conduit mais aussi suit les tendances </li><ul><li>Support REST, conf. Java/annotation type-safe, support de Java EE 6 </li></ul></ul>
  113. 113. So what? Configurations <ul><li>Portabilité d'un serveur à l'autre
  114. 114. Portable pour différentes génération de Java EE </li><ul><li>J2EE 1.4, Java EE 5 & 6 </li></ul></ul>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. 115. So what? configurations <ul><li>Support partiel de Java EE 6
  116. 116. Utiliser Java EE 6 sur un serveur/conteneur Web J2EE 1.4 ou Java EE 5 </li></ul>v. 5.0, v. 5.5, v. 6.0 JPA 2.0
  117. 117. So what? Migrer vers Spring 3.0 <ul><li>Spring 3.0 est 99,99 % compatible avec Spring 2.5 </li><ul><li>JAR « drop-in » </li></ul><li>Quelques erreurs de compilation possibles </li><ul><li>Transtypage applicatif / passage aux génériques </li></ul><li>Les projets du portfolio sont généralement testés sur Spring 2.5 ET Spring 3.0 </li></ul>
  118. 118. So what? Roadmap <ul><li>Spring 3.1 courant 2010 </li><ul><li>Support pour Java EE 6 </li></ul><li>Projets du portfolio vont s'aligner sur Spring 3.0 </li><ul><li>Et exploiter les nouveautés </li></ul><li>Idem pour la « plateforme » </li><ul><li>dm Server/Virgo, SpringSource Tool Suite, Grails, etc. </li></ul></ul>
  119. 119. Agenda <ul><li>Un peu d'histoire... </li><ul><li>Les différentes version de Spring </li></ul><li>Les nouveautés de Spring 3.0 </li><ul><li>Java 5, Expression Language, REST, etc. </li></ul><li>So what?
  120. 120. Conclusion </li></ul>
  121. 121. Conclusion <ul><li>Spring 3.0 = passage à maturité du framework </li><ul><li>Évolution du modèle de composants
  122. 122. Support de standards
  123. 123. Portabilité </li></ul><li>Plus seulement un framework applicatif...
  124. 124. … une plateforme </li><ul><li>Pour un ensemble de projets
  125. 125. Pour du middleware (ex. : OSGi) </li></ul></ul>
  126. 126. Agenda <ul><li>Questions ? </li></ul>
  127. 127. Merci de votre attention ! <ul><li>Tirage au sort pour 2 exemplaires de Spring par la pratique V2 ! </li></ul>
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×