Spring est mort, vive Spring

1,847 views

Published on

Présentation au MarsJUG des nouveautés de Spring 3.1, et en particulier "Spring sans XML"

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

No Downloads
Views
Total views
1,847
On SlideShare
0
From Embeds
0
Number of Embeds
40
Actions
Shares
0
Downloads
17
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • @SlowService\n@CachePut\n@Caching(@CacheEvict(«primary»), @CacheEvict(«secondary», «otherkey»))\n\n
  • \n
  • \n
  • Etendre de WebMvcConfigurer et overrider les méthodes nécessaires\n
  • Etendre de WebMvcConfigurer et overrider les méthodes nécessaires\n
  • Etendre de WebMvcConfigurer et overrider les méthodes nécessaires\n
  • Etendre de WebMvcConfigurer et overrider les méthodes nécessaires\n
  • Etendre de WebMvcConfigurer et overrider les méthodes nécessaires\n
  • Etendre de WebMvcConfigurer et overrider les méthodes nécessaires\n
  • Etendre de WebMvcConfigurer et overrider les méthodes nécessaires\n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • WebApplicationInitializer vs ServletContainerInitializer\n\n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • Spring est mort, vive Spring

    1. 1. Spring est mort,Vive Spring ! par Gildas Cuisinier @gcuisinier 1
    2. 2. whois(@gcuisinier)• Maître Artisan Développeur, Sfeir Benelux• Initiateur de la section Spring de @Developpez.com• Relecteur de plusieurs livres sur Spring• Evangéliste Spring 2
    3. 3. Spring est mort ? 3
    4. 4. cyg.be/SpringJEE
    5. 5. JEE en 2012 None J2EE 14 JEE 5 JEE 6cyg.be/SpringJEE 5
    6. 6. JEE en 2012 None J2EE 14 JEE 5 JEE 6 56% 27% 13% 4%cyg.be/SpringJEE 5
    7. 7. Adoption JEE 6 1 an 6 mois Actuellement Ne sais pas Jamaiscyg.be/SpringJEE 6
    8. 8. Adoption JEE 6 1 an 6 mois Actuellement Ne sais pas Jamais 12% 11% 13% 42% 21%cyg.be/SpringJEE 6
    9. 9. Migration de l’existant En partie Ne se prononce pas Non, nous gardons Spring Ouicyg.be/SpringJEE 7
    10. 10. Migration de l’existant En partie Ne se prononce pas Non, nous gardons Spring Oui 8% 19% 22% 51%cyg.be/SpringJEE 7
    11. 11. JEE - Nouveau projet En partie Ne se prononce pas Non Ouicyg.be/SpringJEE 8
    12. 12. JEE - Nouveau projet En partie Ne se prononce pas Non Oui 16% 26% 37% 21%cyg.be/SpringJEE 8
    13. 13. BILAN 9
    14. 14. BILAN• Spécification fin 2009• JEE 6 commence à percer en production • 25-30% actuellement • > 50% d’ici 1 an 9
    15. 15. Spring en 2012 Aucun Spring 2.0 Spring 2.5 Spring 3.0 Spring 3.1cyg.be/SpringJEE 10
    16. 16. Spring en 2012 Aucun Spring 2.0 Spring 2.5 Spring 3.0 Spring 3.1 50% 6% 2% 23% 19%cyg.be/SpringJEE 10
    17. 17. Spring 3.1 1 an 6 mois Actuellement Plus d’un an Jamaiscyg.be/SpringJEE 11
    18. 18. Spring 3.1 1 an 6 mois Actuellement Plus d’un an Jamais 28% 9% 29% 26% 8%cyg.be/SpringJEE 11
    19. 19. BILAN 12
    20. 20. BILAN• 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 12
    21. 21. Pourquoi tant de haine ? 13
    22. 22. ReprochesDiffile à mettre en place Invasif Trop de XML PropriétaireJEE6 fait la même chose Autres Rien 14
    23. 23. Reproches Diffile à mettre en place Invasif Trop de XML Propriétaire JEE6 fait la même chose Autres Rien40302010 0 JEE 1.4 14
    24. 24. Flash back 2004 15
    25. 25. 0 0 42
    26. 26. 0 0 42
    27. 27. Spring 1.01 <bean id="monBean" class="be.hikage.service.MyService">2 <property name="version" value="maVersion"/>3 </bean> 17
    28. 28. Spring 1.0 1 <bean id="monBean" class="be.hikage.service.MyService"> 2 <property name="version" value="maVersion"/> 3 </bean> 4 5 <bean /> 6 <bean /> 7 <bean /> 8 <bean /> 9 <bean />10 <bean /> 18
    29. 29. Spring 1.2 200 We 5 b2 .01 <bean id="monBean" class="be.hikage.service.MyService">2 <property name="version" value="maVersion"/>3 </bean>45 <import resource="service-layer.xml"/>6 <import resource="dao-layer.xml"/>7 <import resource="disp-layer.xml"/> 19
    30. 30. "> Proxy xy" lter Chain inPro il.Fi Sourc e "> filt erCha curi ty.ut ition an id =" g.ace gise Defin1 <be s="or ation clas lter Invoc e="fi PARIS ON2 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 20
    31. 31. Spring 2.0 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_USER"/>1011 <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> 21
    32. 32. Spring 2.5 200 Sar 7 koz y 1 @Component 2 public class MyController { 3 4 private MyService myService; 5 6 @Autowired 7 public void setMyService(MyService myService) { 8 this.myService = myService; 9 }1011 } 22
    33. 33. Spring 2.5 200 Sar 7 koz y 1 @Component 2 public class MyController { 3 4 private MyService myService; 5 6 @Autowired 7 public void setMyService(MyService myService) { 8 this.myService = myService; 9 }1011 }1 <context:component-scan base-package="be.hikage" /> 22
    34. 34. Spring 3.0 R 200 ach 9 at Sun de1 @Configuration2 public class ApplicationConfig {34 @Bean5 public MyService myService() {6 return new MyService();7 }89 } 23
    35. 35. Spring 3.0 R 200 ach 9 at Sun de1 @Configuration // <beans>2 public class ApplicationConfig {34 @Bean //<bean id="myService>5 public MyService myService() {6 return new MyService();7 }89 } 24
    36. 36. Spring 3.0 R 200 ach 9 at Sun de 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) 24
    37. 37. Spring 3.1 25
    38. 38. Annotation++ 26
    39. 39. @ComponentScan1 <context:component-scan base-package="be.hikage"/> 27
    40. 40. @ComponentScan1 <context:component-scan base-package="be.hikage"/>1 @Configuration2 @ComponentScan("be.hikage")3 public class ApplicationConfig 27
    41. 41. @EnableScheduling1 public class MaTache {23 @Scheduled(fixedRate = 1000)4 public void execute() {5 System.out.println("Maman, je parle au MarsJUG");6 }7 } 28
    42. 42. @EnableScheduling1 <task:annotation-driven /> 29
    43. 43. @EnableScheduling1 <task:annotation-driven />1 @Configuration2 @EnableScheduling3 public class ApplicationConfig {4 } 29
    44. 44. @EnableScheduling1 @Target(ElementType.TYPE)2 @Retention(RetentionPolicy.RUNTIME)3 @Import(SchedulingConfiguration.class)4 @Documented5 public @interface EnableScheduling {67 } 30
    45. 45. @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 } 910 } 31
    46. 46. @EnableCaching 1 @Service 2 public class CalculateurPrix { 3 4 @Cacheable(value = "price") 5 public Double calculePrix(String reference){ 6 // calcul long et complexe 7 return new Random().nextDouble(); 8 } 91011121314 } 32
    47. 47. @EnableCaching 1 @Service 2 public class CalculateurPrix { 3 4 @Cacheable(value = "price") 5 public Double calculePrix(String reference){ 6 // calcul long et complexe 7 return new Random().nextDouble(); 8 } 910 @CacheEvict(value = "price",allEntries = true)11 public void setRistourne(Float indice){1213 }14 } 33
    48. 48. @EnableCaching1 <caching:annotation-driven />23 <bean class="org.springframework.cache .concurrent.ConcurrentMapCacheManager"/>4 34
    49. 49. @EnableCaching 1 @Configuration 2 @EnableCaching 3 public class ApplicationConfig { 4 5 @Bean 6 CacheManager cacheManager(){ 7 return 8 new ConcurrentMapCacheManager(); 9 }10 } 35
    50. 50. Abstraction de Cache• Out of the Box ✓ ConcurrentHashMap ✓ EhCache• GemFire 36
    51. 51. @EnableWebMvc1 <mvc:annotation-driven /> 37
    52. 52. @EnableWebMvc1 <mvc:annotation-driven />1 @Configuration2 @EnableWebMvc3 public class WebConfig {4 } 37
    53. 53. @EnableWebMvc1 <mvc:annotation-driven/>2 <mvc:interceptors>3 <bean class="osf..LocaleChangeInterceptor"/>4 </mvc:interceptors> 38
    54. 54. @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 } 39
    55. 55. @EnableWebMvc 40
    56. 56. @EnableWebMvcAjout Intercepteur 40
    57. 57. @EnableWebMvcAjout IntercepteurConfiguration de ViewController 40
    58. 58. @EnableWebMvcAjout IntercepteurConfiguration de ViewControllerAjout de ResourceHandler 40
    59. 59. @EnableWebMvcAjout IntercepteurConfiguration de ViewControllerAjout de ResourceHandler 40
    60. 60. @EnableWebMvcAjout IntercepteurConfiguration de ViewControllerAjout de ResourceHandlerNe permet pas une configuration fine 40
    61. 61. @EnableWebMvc Ajout Intercepteur Configuration de ViewController Ajout de ResourceHandler Ne permet pas une configuration fine➡ @EnableWebMvc et étendre WebMvcConfigurationSupport 40
    62. 62. @Enable* 41
    63. 63. @Enable*• EnableAsync 41
    64. 64. @Enable*• EnableAsync• EnableAspectJAutoProxy 41
    65. 65. @Enable*• EnableAsync• EnableAspectJAutoProxy• EnableSpringConfigured 41
    66. 66. @Enable*• EnableAsync• EnableAspectJAutoProxy• EnableSpringConfigured• EnableLoadTimeWeaving 41
    67. 67. @Enable*• EnableAsync• EnableAspectJAutoProxy• EnableSpringConfigured• EnableLoadTimeWeaving• EnableTransactionManagement 41
    68. 68. Testing 2.5 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 } 42
    69. 69. Testing 3.1 1 @RunWith(SpringJUnit4ClassRunner.class) 2 @ContextConfiguration(classes = TestConfig.class) 3 @ActiveProfiles("test") 4 public class MyTest { 5 @Autowired 6 MyService service; 7 8 @Test 9 public void myTest(){10 }11 } 43
    70. 70. Servlet 3.0 44
    71. 71. 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");1213 }14 }
    72. 72. DEMO 46
    73. 73. Profile 47
    74. 74. JNDI• Séparation entre l’utilisation d’une ressource et sa définition• Inadapté pour une configuration différente 48
    75. 75. 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"> 23 <jdbc:script4 location="schema.sql"/>5 <jdbc:script6 location="test-data.sql"/>7 </jdbc:embedded-database> 49
    76. 76. @Profile 1 @Configuration 2 public class ApplicationConfig { 3 4 @Bean 5 DataSource dataSource(){ 6 JndiObjectFactoryBean result = new JndiObjectFactoryBean(); 7 result.setJndiName("jdbc/dataSource"); 8 return (DataSource) result.getObject(); 9 }10 } 50
    77. 77. @Profile 1 @Configuration 2 @Profile("dev") 3 public class DevConfig { 4 5 @Bean 6 MyService monBean() { 7 MyService tmp = new MyService(); 8 tmp.setVersion("dev"); 9 return tmp;10 }1112 } 51
    78. 78. <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> 52
    79. 79. Activation1 <webapp>2 <context-param>3 <param-name>spring.profiles.active</param-name>4 <param-value>dev</param-value>5 </context-param>6 </webapp> 53
    80. 80. Activation1 <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> 54
    81. 81. Spring 3.1, c’est aussi• Support Hibernate 4• Namespace c:• JPA sans Persistence.xml• ... 55
    82. 82. Conclusions 56
    83. 83. Questions ? 57
    84. 84. Resourcescyg.be/cbeamsSpring31 cyg.be/costinlDevoxx11cyg.be/SpringSourceBlog cyg.be/MattRaibleSpring31 58
    85. 85. Crédits© suzesizu - Fotolia.com © vsurkov - Fotolia.com © Tiler84 - Fotolia.com© Mitarart - Fotolia.com © Beboy - Fotolia.com 59

    ×