Download - Spring est mort, Vive Spring à Devoxx France
Spring est mort, Vive Springby Gildas Cuisinier
@gcuisinier
1samedi 21 avril 2012
Agenda
• Episode 1 : Un nouvel espoir
• Episode 2 : Le JCP contre-attaque
• Episode 3 : Le retour du Printemps
2samedi 21 avril 2012
Gildas Cuisinier
• @gcuisinier
• Maitre Artisan Développeur @ Sfeir Benelux
• Evangéliste Spring depuis plusieurs année
3samedi 21 avril 2012
Episode i ( ou iv )
Un nouvel espoir
4samedi 21 avril 2012
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
Un nouvel espoir !
• Conteneur léger, OpenSource
• S'intègre avec les forces en place
• Simplifie les tests
• Basé sur du XML
6samedi 21 avril 2012
7
<beans>
<bean class="spring.Jedi" id="RodJohnson"> <property name="nom" value="Rod Johnson" /> <property name="rang" value="maitre" />
</bean>
</beans>
samedi 21 avril 2012
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>
samedi 21 avril 2012
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>
samedi 21 avril 2012
Première évolution
10
<beans>
<import resource="jedis.xml" />
<import resource="sabres.xml" />
<import resource="siths.xml" />
</beans>
samedi 21 avril 2012
11
1 <bean id=
"filterChain
Proxy"
2
class="org.a
cegisecurity
.util.Filter
ChainProxy">
3 <p
roperty name
="filterInvo
cationDefini
tionSource">
4
<value>
5
CONVER
T_URL_TO_LOW
ERCASE_BEFOR
E_COMPARISON
6
PATTER
N_TYPE_APACH
E_ANT
7
/login
=
8
httpSe
ssionContext
IntegrationF
ilter
9
/login
.form=
10
httpSe
ssionContext
IntegrationF
ilter
11
/asset
s/**=
12
httpSe
ssionContext
IntegrationF
ilter
13
/j_ace
gi_security_
check=
14
httpSe
ssionContext
IntegrationF
ilter,
15
formAu
thentication
ProcessingFi
lter
16
/**=
17
httpSe
ssionContext
IntegrationF
ilter,
18
except
ionTranslati
onFilter
19
</value>
20 </
property>
21 </bean
>
22 <bean
id="httpSess
ionContextIn
tegrationFil
ter"
23
class="org.a
cegisecurity
...HttpSessi
onContextInt
egrationFilt
er">
24 </bean
>
25
26 <bean
id="formLogi
nAuthenticat
ionEntryPoin
t"
27
class="org.a
cegisecurity
...Authentic
ationProcess
ingFilterEnt
ryPoint">
28 <p
roperty name
="loginFormU
rl" value="/
login"/>
29 <p
roperty name
="forceHttps
" value="fal
se"/>
30 </bean
>
samedi 21 avril 2012
Seconde évolution
12
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>
samedi 21 avril 2012
Seconde évolution, bis
13
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" />
samedi 21 avril 2012
Episode ii ( ou v )
Le JCP contre-attaque
14samedi 21 avril 2012
JEE 6 à nouveau sexy
• Simplicité
• Testabilité
• Légèreté
MAIS
• Nécessite une migration
15samedi 21 avril 2012
Spring 3.0
16
1 @Configuration2 public class ApplicationConfig {3 4 @Bean5 public MyService myService() { 6 return new MyService();7 }8 9 }
samedi 21 avril 2012
Spring 3.0
17
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)
samedi 21 avril 2012
JEE 6, la mort de Spring ?
18
cyg.be/SpringJEE
samedi 21 avril 2012
19
27%
56%
13%4%
None J2EE 14 JEE 5 JEE 6
cyg.be/SpringJEE
JEE en 2012
samedi 21 avril 2012
20
12%
42%21%
13%
11%
1 an 6 mois Actuellement Ne sais pas Jamais
cyg.be/SpringJEE
Adoption JEE 6
samedi 21 avril 2012
21
8%
51%
22%
19%
En partie Ne se prononce pas Non, nous gardons Spring Oui
cyg.be/SpringJEE
Conversion des troupes actuelles
samedi 21 avril 2012
22
16%
37%21%
26%
En partie Ne se prononce pas Non Oui
cyg.be/SpringJEE
JEE - Nouvelle troupes
samedi 21 avril 2012
23
BILAN
• Spécification fin 2009
• JEE 6 commence à percer en production
• 25-30% actuellement
• > 50% d’ici 1 an
samedi 21 avril 2012
24
23%
50%
6%
2%
19%
Aucun Spring 2.0 Spring 2.5 Spring 3.0 Spring 3.1
cyg.be/SpringJEE
Spring en 2012
samedi 21 avril 2012
25
26%
9%
28%
29%
8%
1 an 6 mois Actuellement Plus d’un an Jamais
cyg.be/SpringJEE
Spring 3.1
samedi 21 avril 2012
26
0
10
20
30
40
Diffile à mettre en place Invasif Trop de XML PropriétaireJEE6 fait la même chose Autres Rien
Reproches
samedi 21 avril 2012
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
samedi 21 avril 2012
Episode iii ( ou vi )
Le retour du Printemps
28samedi 21 avril 2012
AméliorationNoXML
29samedi 21 avril 2012
Spring 3.0
30
• JavaConfig permet de remplacer la configuration XML
• Ne supporte pas toute les possibilités de la configuration XML
• Spring 3.1 vient combler ces lacunes
1 @Configuration // <beans>2 public class ApplicationConfig {3 4 @Bean //<bean id="myService> 5 public MyService myService() {6 return new MyService();7 }8 9 }
samedi 21 avril 2012
@ComponentScan
31
1 @Configuration2 @ComponentScan("spring")3 public class ApplicationConfig
1 <context:component-scan base-package="spring"/>
samedi 21 avril 2012
32
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 }
@EnableScheduling
samedi 21 avril 2012
@EnableScheduling
33
1 @Configuration2 @EnableScheduling3 public class ApplicationConfig {4 }
1 <task:annotation-driven />
samedi 21 avril 2012
34
1 @Target(ElementType.TYPE)2 @Retention(RetentionPolicy.RUNTIME)3 @Import(SchedulingConfiguration.class)4 @Documented5 public @interface EnableScheduling {6 7 }
@EnableScheduling
samedi 21 avril 2012
35
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 }
@EnableScheduling
samedi 21 avril 2012
36
1 <mvc:annotation-driven />
1 @Configuration2 @EnableWebMvc3 public class WebConfig {4 }
@EnableWebMvc
samedi 21 avril 2012
37
1 <mvc:annotation-driven/>2 <mvc:interceptors>3 <bean class="osf..LocaleChangeInterceptor"/>4 </mvc:interceptors>
@EnableWebMvc
samedi 21 avril 2012
38
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 }
@EnableWebMvc + WebMvcConfigurerAdapter
samedi 21 avril 2012
39
Ajout Intercepteur
Configuration de ViewController
Ajout de ResourceHandler
Ne permet pas une configuration fine
➡@EnableWebMvc et étendre WebMvcConfigurationSupport
@EnableWebMvc
samedi 21 avril 2012
40
@Enable*
<context:spring-configured/> @EnableSpringConfigured
<context:load-time-weaver/> @EnableLoadTimeWeaving
<tx:annotation-driven/> @EnableTransactionManagement
<task:annotation-driven/> @EnableAsync
<aop:aspectj-autoproxy/> @EnableAspectJAutoProxy
samedi 21 avril 2012
41
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 }
Testing 3.0
samedi 21 avril 2012
42
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 }
Testing 3.1
samedi 21 avril 2012
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 }
43
WebApplicationInitializer
samedi 21 avril 2012
Nouveau pouvoir :Cacher des resources
44samedi 21 avril 2012
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 }
samedi 21 avril 2012
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 }
samedi 21 avril 2012
47
1 @Configuration 2 @EnableCaching 3 public class ApplicationConfig { 4 5 @Bean 6 CacheManager cacheManager(){ 7 return 8 new ConcurrentMapCacheManager(); 9 }10 }
@EnableCaching
samedi 21 avril 2012
48
1 <caching:annotation-driven />2 3 <bean class="org.springframework.cache .concurrent.ConcurrentMapCacheManager"/>4
@EnableCaching
samedi 21 avril 2012
• Out of the Box
✓ConcurrentHashMap
✓ EhCache
• GemFire
49
Abstraction de Cache
samedi 21 avril 2012
50
Nouveau pouvoir
Adaptation au terrain
samedi 21 avril 2012
51
• Séparation entre l’utilisation d’une ressource et sa définition
• Inadapté pour une configuration différente
JNDI
samedi 21 avril 2012
52
1 <import resource="config-${env}.xml"/>
1 System.setProperty("env", "TEST");
1 <jdbc:embedded-database
2 id="dataSource">
3 <jdbc:script
4 location="schema.sql"/>
5 <jdbc:script
6 location="test-data.sql"/>
7 </jdbc:embedded-database>
1 <jee:jndi-lookup jndi-name="jdbc/datasource"/>
2
Import + Propriété Système
samedi 21 avril 2012
53
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 }
@Profile
samedi 21 avril 2012
54
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 }
@Profile
samedi 21 avril 2012
55
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 }
@Profile
samedi 21 avril 2012
56
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>
<Profile />
samedi 21 avril 2012
57
1 <webapp>2 <context-param>3 <param-name>spring.profiles.active</param-name>4 <param-value>dev</param-value>5 </context-param>6 </webapp>
Activation
samedi 21 avril 2012
58
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>
Activation
samedi 21 avril 2012
59
• Support Hibernate 4
• Namespace c:
• JPA sans Persistence.xml
• Amélioration de REST dans SpringMVC
• FlashMap dans Spring MVC
Spring 3.1, c’est aussi
samedi 21 avril 2012
Security
Batch
FrameworkIntegration
SpringData SpringMobile
SpringAndroid SpringSocialFlex
60
L’Univers de Spring
samedi 21 avril 2012
Conclusion
• Spring est largement répandu
• Spring continue à évoluer
✓ NoXML
✓ Ouvert au Cloud
• Spring est un écosystème
61samedi 21 avril 2012
62
cyg.be/cbeamsSpring31 cyg.be/costinlDevoxx11
cyg.be/SpringSourceBlog cyg.be/MattRaibleSpring31
samedi 21 avril 2012
Sources des images
63
http://www.thegeekshowpodcast.com
http://www.thinkgeek.com
http://gadgetsin.com
raven - Fotolia.com
samedi 21 avril 2012