Spring est mort,Vive Spring                                by Gildas Cuisinier                                   @gcuisini...
Agenda                  •    Episode 1 : Un nouvel espoir                  •    Episode 2 : Le JCP contre-attaque         ...
Gildas Cuisinier                  •    @gcuisinier                  •    Maitre Artisan Développeur @ Sfeir Benelux       ...
Episode i      ( ou iv )                          Un nouvel espoir                                                  4samed...
La plateforme de la mort                  •    Plateforme standard, définie par le JCP                  •    Gros défauts :...
Un nouvel espoir !                           •   Conteneur léger, OpenSource                           •   Sintègre avec l...
<beans>                           <bean class="spring.Jedi" id="RodJohnson">                               <property name=...
<beans>                           <bean class="spring.Jedi" id="RodJohnson">                               <property name=...
Premières lacunes                       <beans>                           <bean class="spring.Jedi" id="RodJohnson"/>     ...
Première évolution                       <beans>                           <import resource="jedis.xml" />                ...
">                                                                                       Proxy                            ...
Seconde évolution                   1 <security:http auto-config="true">                   2     <security:intercept-url p...
Seconde évolution, bis                        1 @Component                        2 public class Jedi {                   ...
Episode ii        ( ou v )                         Le JCP contre-attaque                                                  ...
JEE 6 à nouveau sexy               •       Simplicité               •       Testabilité               •       Légèreté    ...
Spring 3.0                       1 @Configuration                       2 public class ApplicationConfig {                ...
Spring 3.0                                      1 @Configuration   // <beans>                                      2 publi...
JEE 6, la mort de Spring ?                               cyg.be/SpringJEE                                                 ...
JEE en 2012                          None     J2EE 14         JEE 5   JEE 6                                         56%   ...
Adoption JEE 6                          1 an   6 mois         Actuellement           Ne sais pas   Jamais                 ...
Conversion des troupes actuelles                            En partie   Ne se prononce pas   Non, nous gardons Spring   Ou...
JEE - Nouvelle troupes                           En partie   Ne se prononce pas         Non   Oui                         ...
BILAN                       •   Spécification fin 2009                       •   JEE 6 commence à percer en production      ...
Spring en 2012                          Aucun   Spring 2.0         Spring 2.5         Spring 3.0   Spring 3.1             ...
Spring 3.1                          1 an   6 mois         Actuellement          Plus d’un an   Jamais                     ...
Reproches                            Diffile à mettre en place   Invasif   Trop de XML   Propriétaire                      ...
•   Spring 3.0 - Sorti en même temps que JEE 6                           •   Bien présent en production                   ...
Episode iii       ( ou vi )                         Le retour du Printemps                                                ...
Amélioration                        NoXML                                      29samedi 21 avril 2012
Spring 3.0          • JavaConfig permet de remplacer la                configuration XML                      1 @Configurati...
@ComponentScan                   1 <context:component-scan                   base-package="spring"/>                   1 @...
@EnableScheduling                       1 public class MaTache {                       2                       3    @Sched...
@EnableScheduling                       1 <task:annotation-driven />                       1   @Configuration             ...
@EnableScheduling                       1   @Target(ElementType.TYPE)                       2   @Retention(RetentionPolicy...
@EnableScheduling        1 @Configuration        2 public class SchedulingConfiguration {        3        4     @Bean(name...
@EnableWebMvc                       1 <mvc:annotation-driven />                       1   @Configuration                  ...
@EnableWebMvc                       1 <mvc:annotation-driven/>                       2 <mvc:interceptors>                 ...
@EnableWebMvc +                                WebMvcConfigurerAdapter                        1   @Configuration           ...
@EnableWebMvc                        Ajout Intercepteur                        Configuration de ViewController             ...
@Enable*                  <context:spring-configured/>           @EnableSpringConfigured                  <context:load-ti...
Testing 3.0                        1   @RunWith(SpringJUnit4ClassRunner.class)                        2   @ContextConfigur...
Testing 3.1                        1   @RunWith(SpringJUnit4ClassRunner.class)                        2   @ContextConfigur...
WebApplicationInitializer               1 public class WebInitializer implements WebApplicationInitializer {              ...
Nouveau pouvoir :                       Cacher des resources                                              44samedi 21 avri...
1 @Service                        2 public class AllianceRebelle {                        3                        4     @...
1 @Service                        2 public class AllianceRebelle {                        3                        4     @...
@EnableCaching                        1   @Configuration                        2   @EnableCaching                        ...
@EnableCaching                       1 <caching:annotation-driven />                       2                       3     <...
Abstraction de Cache                  •     Out of the Box                       ✓ ConcurrentHashMap                      ...
Nouveau pouvoir                       Adaptation au terrain                                               50samedi 21 avri...
JNDI                  •    Séparation entre l’utilisation d’une ressource et sa définition                  •    Inadapté p...
Import + Propriété Système                                          1 <import resource="config-${env}.xml"/>              ...
@Profile            1 @Configuration            2            3 public class ApplicationConfig {            4            5  ...
@Profile            1 @Configuration            2 @Import(ApplicationDevConfig.class)            3 public class Application...
@Profile            1 @Configuration            2 @Profile("dev")            3 public class ApplicationDevConfig {         ...
<Profile />           1 <beans profile="dev">           2     <jdbc:embedded-database id="dataSource">           3         ...
Activation            1 <webapp>            2     <context-param>            3          <param-name>spring.profiles.active...
Activation            1 <servlet>            2     <servlet-name>dispatcher</servlet-name>            3     <servlet-class...
Spring 3.1, c’est aussi                  •    Support Hibernate 4                  •    Namespace c:                  •   ...
L’Univers de Spring                       SpringData       Batch                  SpringMobile                            ...
Conclusion                  •     Spring est largement répandu                  •     Spring continue à évoluer           ...
cyg.be/cbeamsSpring31      cyg.be/costinlDevoxx11                       cyg.be/SpringSourceBlog   cyg.be/MattRaibleSpring3...
Sources des images            http://www.thegeekshowpodcast.com                                                http://www....
Upcoming SlideShare
Loading in …5
×

Spring est mort, Vive Spring à Devoxx France

4,950 views

Published on

Présentation lors de Devoxx France 2012

Published in: Technology, Business
0 Comments
8 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
4,950
On SlideShare
0
From Embeds
0
Number of Embeds
78
Actions
Shares
0
Downloads
50
Comments
0
Likes
8
Embeds 0
No embeds

No notes for slide

Spring est mort, Vive Spring à Devoxx France

  1. 1. Spring est mort,Vive Spring by Gildas Cuisinier @gcuisinier 1samedi 21 avril 2012
  2. 2. Agenda • Episode 1 : Un nouvel espoir • Episode 2 : Le JCP contre-attaque • Episode 3 : Le retour du Printemps 2samedi 21 avril 2012
  3. 3. Gildas Cuisinier • @gcuisinier • Maitre Artisan Développeur @ Sfeir Benelux • Evangéliste Spring depuis plusieurs année 3samedi 21 avril 2012
  4. 4. Episode i ( ou iv ) Un nouvel espoir 4samedi 21 avril 2012
  5. 5. La plateforme de la mort • Plateforme standard, définie par le JCP • Gros défauts : • Applications difficilement testables • Application non portables entre les différentes implémentations 5  samedi 21 avril 2012
  6. 6. Un nouvel espoir ! • Conteneur léger, OpenSource • Sintègre avec les forces en place • Simplifie les tests • Basé sur du XML 6samedi 21 avril 2012
  7. 7. <beans> <bean class="spring.Jedi" id="RodJohnson"> <property name="nom" value="Rod Johnson" /> <property name="rang" value="maitre" /> </bean> </beans> 7samedi 21 avril 2012
  8. 8. <beans> <bean class="spring.Jedi" id="RodJohnson"> <property name="nom" value="Rod Johnson" /> <property name="rang" value="maitre" /> <property name="arme" ref="sabreVert"/> </bean> <bean class="spring.arme.SabreLaser" id="sabreVert"> <property name="couleur" value="vert"/> </bean> </beans> 8samedi 21 avril 2012
  9. 9. Premières lacunes <beans> <bean class="spring.Jedi" id="RodJohnson"/> <bean class="spring.Jedi" id="JuergenHoeller"/> <bean class="spring.arme.SabreLaser" id="sabreVert" /> <bean class="spring.arme.SabreLaser" id="sabreBleu" /> ... </beans> 9samedi 21 avril 2012
  10. 10. Première évolution <beans> <import resource="jedis.xml" /> <import resource="sabres.xml" /> <import resource="siths.xml" /> </beans> 10samedi 21 avril 2012
  11. 11. "> Proxy xy" lter Chain inPro il.Fi Sourc e "> filt erCha curi ty.ut ition an id =" g.ace gise Defin 1 <be s="or ation clas lter Invoc e="fi PARIS ON 2 ert y nam E_COM <prop ASE_B EFOR 3 lue> OWERC <v a _TO_L T_URL NT 4 C ONVER CHE_A P E_APA RN_TY 5 PATTE er nFilt n = nteg ratio 6 /logi textI essi onCon 7 httpS lter rm= ionFi in.fo egrat 8 /log xtInt Conte e ssion 9 httpS ter = onFil ts/** Inte grati 10 /asse ntext ess ionCo eck= 11 httpS ty_ch er, ecuri nFilt eg i_s nteg ratio 12 /j_ac textI er onCon gFilt essi Proc essin 13 httpS ation uth entic 14 formA er, nFilt nteg ratio 15 /**= textI essi onCon lter 16 httpS ionFi ra nslat tionT 17 excep ue> 18 < /v a l r"> 19 roper ty> lter" Filte </p ionFi tegr ation egrat extIn 20 n> onte xtInt ssio nCont </bea sionC ttpSe 1 tpSes y...H 2 id="h t curit <bean egise 22 ="o rg.ac class Point "> 23 t" lter Entry </bea n> yPoin ingFi 24 atio nEntr onPr ocess entic icati Logi nAuth ..Au thent "/> 25 "form rity. login n id= isecu ue="/ <bea .aceg mUrl" val 26 ="org inFor e"/> class og "fals me="l alue= 27 erty na ps" v <prop ceHtt name ="for 28 erty <prop 29 n> </bea 30 11samedi 21 avril 2012
  12. 12. Seconde évolution 1 <security:http auto-config="true"> 2 <security:intercept-url pattern="/login*" 3 access="IS_AUTHENTICATED_ANONYMOUSLY"/> 4 <security:intercept-url pattern="/logoutSuccess*" 5 access="IS_AUTHENTICATED_ANONYMOUSLY"/> 6 <security:intercept-url pattern="/css/main.css" 7 access="IS_AUTHENTICATED_ANONYMOUSLY"/> 8 <security:intercept-url pattern="/**" 9 access="ROLE_JEDI"/> 10 11 <security:form-login login-page="/login.html" 12 login-processing-url="/loginProcess" 13 default-target-url="/index.jsp" 14 <security:logout logout-url="/logout" 15 logout-success-url="/logoutSuccess.html"/> 16 </security:http> 12samedi 21 avril 2012
  13. 13. Seconde évolution, bis 1 @Component 2 public class Jedi { 3 4 private Arme arme; 5 6 @Autowired 7 public void setArme(Arme arme) { 8 this.arme = arme; 9 } 10 11 } 1 <context:component-scan base-package="spring" /> 13samedi 21 avril 2012
  14. 14. Episode ii ( ou v ) Le JCP contre-attaque 14samedi 21 avril 2012
  15. 15. JEE 6 à nouveau sexy • Simplicité • Testabilité • Légèreté MAIS • Nécessite une migration 15samedi 21 avril 2012
  16. 16. Spring 3.0 1 @Configuration 2 public class ApplicationConfig { 3 4 @Bean 5 public MyService myService() { 6 return new MyService(); 7 } 8 9 } 16samedi 21 avril 2012
  17. 17. Spring 3.0 1 @Configuration // <beans> 2 public class ApplicationConfig { 3 4 @Bean //<bean id="myService> 5 public MyService myService() { 6 return new MyService(); 7 } 8 9 } 1 ApplicationContext factory = 2 new AnnotationConfigApplicationContext(ApplicationConfig.class) 17samedi 21 avril 2012
  18. 18. JEE 6, la mort de Spring ? cyg.be/SpringJEE 18samedi 21 avril 2012
  19. 19. JEE en 2012 None J2EE 14 JEE 5 JEE 6 56% 27% 13% 4% cyg.be/SpringJEE 19samedi 21 avril 2012
  20. 20. Adoption JEE 6 1 an 6 mois Actuellement Ne sais pas Jamais 12% 11% 13% 42% 21% cyg.be/SpringJEE 20samedi 21 avril 2012
  21. 21. Conversion des troupes actuelles En partie Ne se prononce pas Non, nous gardons Spring Oui 8% 19% 22% 51% cyg.be/SpringJEE 21samedi 21 avril 2012
  22. 22. JEE - Nouvelle troupes En partie Ne se prononce pas Non Oui 16% 26% 37% 21% cyg.be/SpringJEE 22samedi 21 avril 2012
  23. 23. BILAN • Spécification fin 2009 • JEE 6 commence à percer en production • 25-30% actuellement • > 50% d’ici 1 an 23samedi 21 avril 2012
  24. 24. Spring en 2012 Aucun Spring 2.0 Spring 2.5 Spring 3.0 Spring 3.1 50% 6% 2% 23% 19% cyg.be/SpringJEE 24samedi 21 avril 2012
  25. 25. Spring 3.1 1 an 6 mois Actuellement Plus d’un an Jamais 28% 9% 29% 26% 8% cyg.be/SpringJEE 25samedi 21 avril 2012
  26. 26. Reproches Diffile à mettre en place Invasif Trop de XML Propriétaire JEE6 fait la même chose Autres Rien 40 30 20 10 0 26samedi 21 avril 2012
  27. 27. • Spring 3.0 - Sorti en même temps que JEE 6 • Bien présent en production • Spring 3.1 - Sorti fin 2011 • ~25% actuellement • > 50% d’ici 1 an 27samedi 21 avril 2012
  28. 28. Episode iii ( ou vi ) Le retour du Printemps 28samedi 21 avril 2012
  29. 29. Amélioration NoXML 29samedi 21 avril 2012
  30. 30. Spring 3.0 • JavaConfig permet de remplacer la configuration XML 1 @Configuration // <beans> 2 public class ApplicationConfig { 3 • Ne supporte pas toute les 4 @Bean //<bean id="myService> possibilités de la configuration XML 5 6 public MyService myService() { return new MyService(); 7 } 8 9 } • Spring 3.1 vient combler ces lacunes 30samedi 21 avril 2012
  31. 31. @ComponentScan 1 <context:component-scan base-package="spring"/> 1 @Configuration 2 @ComponentScan("spring") 3 public class ApplicationConfig 31samedi 21 avril 2012
  32. 32. @EnableScheduling 1 public class MaTache { 2 3 @Scheduled(fixedRate = 1000) 4 public void execute() { 5 System.out.println("May the Spring be with you"); 6 } 7 } 32samedi 21 avril 2012
  33. 33. @EnableScheduling 1 <task:annotation-driven /> 1 @Configuration 2 @EnableScheduling 3 public class ApplicationConfig { 4 } 33samedi 21 avril 2012
  34. 34. @EnableScheduling 1 @Target(ElementType.TYPE) 2 @Retention(RetentionPolicy.RUNTIME) 3 @Import(SchedulingConfiguration.class) 4 @Documented 5 public @interface EnableScheduling { 6 7 } 34samedi 21 avril 2012
  35. 35. @EnableScheduling 1 @Configuration 2 public class SchedulingConfiguration { 3 4 @Bean(name=AnnotationConfigUtils.SCHEDULED_ANNOTATION_PROCESSOR_BEAN_NAME) 5 @Role(BeanDefinition.ROLE_INFRASTRUCTURE) 6 public ScheduledAnnotationBeanPostProcessor scheduledAnnotationProcessor() { 7 return new ScheduledAnnotationBeanPostProcessor(); 8 } 9 10 } 35samedi 21 avril 2012
  36. 36. @EnableWebMvc 1 <mvc:annotation-driven /> 1 @Configuration 2 @EnableWebMvc 3 public class WebConfig { 4 } 36samedi 21 avril 2012
  37. 37. @EnableWebMvc 1 <mvc:annotation-driven/> 2 <mvc:interceptors> 3 <bean class="osf..LocaleChangeInterceptor"/> 4 </mvc:interceptors> 37samedi 21 avril 2012
  38. 38. @EnableWebMvc + WebMvcConfigurerAdapter 1 @Configuration 2 @EnableWebMvc 3 public class WebConfig 4 extends WebMvcConfigurerAdapter{ 5 6 @Override 7 public void addInterceptors(InterceptorRegistry registry) { 8 registry.addInterceptor(new LocaleChangeInterceptor()); 9 } 10 } 38samedi 21 avril 2012
  39. 39. @EnableWebMvc Ajout Intercepteur Configuration de ViewController Ajout de ResourceHandler Ne permet pas une configuration fine ➡ @EnableWebMvc et étendre WebMvcConfigurationSupport 39samedi 21 avril 2012
  40. 40. @Enable* <context:spring-configured/> @EnableSpringConfigured <context:load-time-weaver/> @EnableLoadTimeWeaving <tx:annotation-driven/> @EnableTransactionManagement <task:annotation-driven/> @EnableAsync <aop:aspectj-autoproxy/> @EnableAspectJAutoProxy 40samedi 21 avril 2012
  41. 41. Testing 3.0 1 @RunWith(SpringJUnit4ClassRunner.class) 2 @ContextConfiguration("test-config.xml") 3 public class MyTest { 4 @Autowired 5 MyService service; 6 7 @Test 8 public void myTest(){ 9 } 10 } 41samedi 21 avril 2012
  42. 42. Testing 3.1 1 @RunWith(SpringJUnit4ClassRunner.class) 2 @ContextConfiguration(classes = TestConfig.class) 3 public class MyTest { 4 @Autowired 5 MyService service; 6 7 @Test 8 public void myTest(){ 9 } 10 } 42samedi 21 avril 2012
  43. 43. WebApplicationInitializer 1 public class WebInitializer implements WebApplicationInitializer { 2 3 @Override 4 public void onStartup(ServletContext servletContext) throws ServletException { 5 6 AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext(); 7 context.register(WebMvcConfig.class); 8 9 ServletRegistration.Dynamic servletConfig = servletContext.addServlet("dispatcher", new DispatcherServlet(context)); 10 servletConfig.setLoadOnStartup(1); 11 servletConfig.addMapping("*.do"); 12 13 } 14 } 43samedi 21 avril 2012
  44. 44. Nouveau pouvoir : Cacher des resources 44samedi 21 avril 2012
  45. 45. 1 @Service 2 public class AllianceRebelle { 3 4 @Cacheable(value = "jedi") 5 public Jedi appellerJedi(String nomJedi) { 6 // attendre accord du conseil 7 // attendre disponibilité du Jedi 8 return chevaliers.getByName(nomJedi); 9 } 10 11 } 45samedi 21 avril 2012
  46. 46. 1 @Service 2 public class AllianceRebelle { 3 4 @Cacheable(value = "jedi") 5 public Jedi appellerJedi(String nomJedi) { 6 // attendre accord du conseil 7 // attendre disponibilité du Jedi 8 return chevaliers.getByName(nomJedi); 9 } 10 11 @CacheEvict(value = "jedi") 12 public void libererJedi(String nomJedi){ 13 14 } 15 16 } 46samedi 21 avril 2012
  47. 47. @EnableCaching 1 @Configuration 2 @EnableCaching 3 public class ApplicationConfig { 4 5 @Bean 6 CacheManager cacheManager(){ 7 return 8 new ConcurrentMapCacheManager(); 9 } 10 } 47samedi 21 avril 2012
  48. 48. @EnableCaching 1 <caching:annotation-driven /> 2 3 <bean class="org.springframework.cache .concurrent.ConcurrentMapCacheManager"/> 4 48samedi 21 avril 2012
  49. 49. Abstraction de Cache • Out of the Box ✓ ConcurrentHashMap ✓ EhCache • GemFire 49samedi 21 avril 2012
  50. 50. Nouveau pouvoir Adaptation au terrain 50samedi 21 avril 2012
  51. 51. JNDI • Séparation entre l’utilisation d’une ressource et sa définition • Inadapté pour une configuration différente 51samedi 21 avril 2012
  52. 52. Import + Propriété Système 1 <import resource="config-${env}.xml"/> 1 System.setProperty("env", "TEST"); 1 <jdbc:embedded-database 1 <jee:jndi-lookup jndi-name="jdbc/datasource"/> 2 id="dataSource"> 2 3 <jdbc:script 4 location="schema.sql"/> 5 <jdbc:script 6 location="test-data.sql"/> 7 </jdbc:embedded-database> 52samedi 21 avril 2012
  53. 53. @Profile 1 @Configuration 2 3 public class ApplicationConfig { 4 5 @Bean 6 DataSource dataSource(){ 7 JndiObjectFactoryBean result = new JndiObjectFactoryBean(); 8 result.setJndiName("jdbc/dataSource"); 9 return (DataSource) result.getObject(); 10 } 11 } 53samedi 21 avril 2012
  54. 54. @Profile 1 @Configuration 2 @Import(ApplicationDevConfig.class) 3 public class ApplicationConfig { 4 5 @Bean 6 DataSource dataSource(){ 7 JndiObjectFactoryBean result = new JndiObjectFactoryBean(); 8 result.setJndiName("jdbc/dataSource"); 9 return (DataSource) result.getObject(); 10 } 11 } 54samedi 21 avril 2012
  55. 55. @Profile 1 @Configuration 2 @Profile("dev") 3 public class ApplicationDevConfig { 4 5 @Bean 6 DataSource dataSource() { 7 SingleConnectionDataSource connection = new SingleConnectionDataSource(...); 8 return connection; 9 } 10 } 55samedi 21 avril 2012
  56. 56. <Profile /> 1 <beans profile="dev"> 2 <jdbc:embedded-database id="dataSource"> 3 <jdbc:script location="schema.sql"/> 4 <jdbc:script location="test-data.sql"/> 5 </jdbc:embedded-database> 6 </beans> 56samedi 21 avril 2012
  57. 57. Activation 1 <webapp> 2 <context-param> 3 <param-name>spring.profiles.active</param-name> 4 <param-value>dev</param-value> 5 </context-param> 6 </webapp> 57samedi 21 avril 2012
  58. 58. Activation 1 <servlet> 2 <servlet-name>dispatcher</servlet-name> 3 <servlet-class>osf.web.servlet.DispatcherServlet</servlet-class> 4 <init-param> 5 <param-name>spring.profiles.active</param-name> 6 <param-value>dev</param-value> 7 </init-param> 8 </servlet> 58samedi 21 avril 2012
  59. 59. Spring 3.1, c’est aussi • Support Hibernate 4 • Namespace c: • JPA sans Persistence.xml • Amélioration de REST dans SpringMVC • FlashMap dans Spring MVC 59samedi 21 avril 2012
  60. 60. L’Univers de Spring SpringData Batch SpringMobile Integration Framework SpringAndroid SpringSocial Security Flex 60samedi 21 avril 2012
  61. 61. Conclusion • Spring est largement répandu • Spring continue à évoluer ✓ NoXML ✓ Ouvert au Cloud • Spring est un écosystème 61samedi 21 avril 2012
  62. 62. cyg.be/cbeamsSpring31 cyg.be/costinlDevoxx11 cyg.be/SpringSourceBlog cyg.be/MattRaibleSpring31 62samedi 21 avril 2012
  63. 63. Sources des images http://www.thegeekshowpodcast.com http://www.thinkgeek.com http://gadgetsin.com raven - Fotolia.com 63samedi 21 avril 2012

×