Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Spring est mort, Vive Spring à Devoxx France

5,007 views

Published on

Présentation lors de Devoxx France 2012

Published in: Technology, Business
  • Be the first to comment

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

×