• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
Spring est mort, vive Spring
 

Spring est mort, vive Spring

on

  • 1,494 views

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

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

Statistics

Views

Total Views
1,494
Views on SlideShare
1,463
Embed Views
31

Actions

Likes
1
Downloads
14
Comments
0

4 Embeds 31

http://www.gcuisinier.net 20
http://www.linkedin.com 5
http://qw82391 3
https://www.linkedin.com 3

Accessibility

Categories

Upload Details

Uploaded via as Apple Keynote

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment
  • \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 Spring est mort, vive Spring Presentation Transcript

  • Spring est mort,Vive Spring ! par Gildas Cuisinier @gcuisinier 1
  • 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
  • Spring est mort ? 3
  • cyg.be/SpringJEE
  • JEE en 2012 None J2EE 14 JEE 5 JEE 6cyg.be/SpringJEE 5
  • JEE en 2012 None J2EE 14 JEE 5 JEE 6 56% 27% 13% 4%cyg.be/SpringJEE 5
  • Adoption JEE 6 1 an 6 mois Actuellement Ne sais pas Jamaiscyg.be/SpringJEE 6
  • Adoption JEE 6 1 an 6 mois Actuellement Ne sais pas Jamais 12% 11% 13% 42% 21%cyg.be/SpringJEE 6
  • Migration de l’existant En partie Ne se prononce pas Non, nous gardons Spring Ouicyg.be/SpringJEE 7
  • Migration de l’existant En partie Ne se prononce pas Non, nous gardons Spring Oui 8% 19% 22% 51%cyg.be/SpringJEE 7
  • JEE - Nouveau projet En partie Ne se prononce pas Non Ouicyg.be/SpringJEE 8
  • JEE - Nouveau projet En partie Ne se prononce pas Non Oui 16% 26% 37% 21%cyg.be/SpringJEE 8
  • BILAN 9
  • BILAN• Spécification fin 2009• JEE 6 commence à percer en production • 25-30% actuellement • > 50% d’ici 1 an 9
  • Spring en 2012 Aucun Spring 2.0 Spring 2.5 Spring 3.0 Spring 3.1cyg.be/SpringJEE 10
  • 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
  • Spring 3.1 1 an 6 mois Actuellement Plus d’un an Jamaiscyg.be/SpringJEE 11
  • Spring 3.1 1 an 6 mois Actuellement Plus d’un an Jamais 28% 9% 29% 26% 8%cyg.be/SpringJEE 11
  • BILAN 12
  • 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
  • Pourquoi tant de haine ? 13
  • ReprochesDiffile à mettre en place Invasif Trop de XML PropriétaireJEE6 fait la même chose Autres Rien 14
  • Reproches Diffile à mettre en place Invasif Trop de XML Propriétaire JEE6 fait la même chose Autres Rien40302010 0 JEE 1.4 14
  • Flash back 2004 15
  • 0 0 42
  • 0 0 42
  • Spring 1.01 <bean id="monBean" class="be.hikage.service.MyService">2 <property name="version" value="maVersion"/>3 </bean> 17
  • 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
  • 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
  • "> 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
  • 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
  • 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
  • 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
  • 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
  • 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
  • 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
  • Spring 3.1 25
  • Annotation++ 26
  • @ComponentScan1 <context:component-scan base-package="be.hikage"/> 27
  • @ComponentScan1 <context:component-scan base-package="be.hikage"/>1 @Configuration2 @ComponentScan("be.hikage")3 public class ApplicationConfig 27
  • @EnableScheduling1 public class MaTache {23 @Scheduled(fixedRate = 1000)4 public void execute() {5 System.out.println("Maman, je parle au MarsJUG");6 }7 } 28
  • @EnableScheduling1 <task:annotation-driven /> 29
  • @EnableScheduling1 <task:annotation-driven />1 @Configuration2 @EnableScheduling3 public class ApplicationConfig {4 } 29
  • @EnableScheduling1 @Target(ElementType.TYPE)2 @Retention(RetentionPolicy.RUNTIME)3 @Import(SchedulingConfiguration.class)4 @Documented5 public @interface EnableScheduling {67 } 30
  • @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
  • @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
  • @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
  • @EnableCaching1 <caching:annotation-driven />23 <bean class="org.springframework.cache .concurrent.ConcurrentMapCacheManager"/>4 34
  • @EnableCaching 1 @Configuration 2 @EnableCaching 3 public class ApplicationConfig { 4 5 @Bean 6 CacheManager cacheManager(){ 7 return 8 new ConcurrentMapCacheManager(); 9 }10 } 35
  • Abstraction de Cache• Out of the Box ✓ ConcurrentHashMap ✓ EhCache• GemFire 36
  • @EnableWebMvc1 <mvc:annotation-driven /> 37
  • @EnableWebMvc1 <mvc:annotation-driven />1 @Configuration2 @EnableWebMvc3 public class WebConfig {4 } 37
  • @EnableWebMvc1 <mvc:annotation-driven/>2 <mvc:interceptors>3 <bean class="osf..LocaleChangeInterceptor"/>4 </mvc:interceptors> 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 } 39
  • @EnableWebMvc 40
  • @EnableWebMvcAjout Intercepteur 40
  • @EnableWebMvcAjout IntercepteurConfiguration de ViewController 40
  • @EnableWebMvcAjout IntercepteurConfiguration de ViewControllerAjout de ResourceHandler 40
  • @EnableWebMvcAjout IntercepteurConfiguration de ViewControllerAjout de ResourceHandler 40
  • @EnableWebMvcAjout IntercepteurConfiguration de ViewControllerAjout de ResourceHandlerNe permet pas une configuration fine 40
  • @EnableWebMvc Ajout Intercepteur Configuration de ViewController Ajout de ResourceHandler Ne permet pas une configuration fine➡ @EnableWebMvc et étendre WebMvcConfigurationSupport 40
  • @Enable* 41
  • @Enable*• EnableAsync 41
  • @Enable*• EnableAsync• EnableAspectJAutoProxy 41
  • @Enable*• EnableAsync• EnableAspectJAutoProxy• EnableSpringConfigured 41
  • @Enable*• EnableAsync• EnableAspectJAutoProxy• EnableSpringConfigured• EnableLoadTimeWeaving 41
  • @Enable*• EnableAsync• EnableAspectJAutoProxy• EnableSpringConfigured• EnableLoadTimeWeaving• EnableTransactionManagement 41
  • 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
  • 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
  • Servlet 3.0 44
  • 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 }
  • DEMO 46
  • Profile 47
  • JNDI• Séparation entre l’utilisation d’une ressource et sa définition• Inadapté pour une configuration différente 48
  • 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
  • @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
  • @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
  • <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
  • 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
  • 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
  • Spring 3.1, c’est aussi• Support Hibernate 4• Namespace c:• JPA sans Persistence.xml• ... 55
  • Conclusions 56
  • Questions ? 57
  • Resourcescyg.be/cbeamsSpring31 cyg.be/costinlDevoxx11cyg.be/SpringSourceBlog cyg.be/MattRaibleSpring31 58
  • Crédits© suzesizu - Fotolia.com © vsurkov - Fotolia.com © Tiler84 - Fotolia.com© Mitarart - Fotolia.com © Beboy - Fotolia.com 59