Spring est mort, Vive Spring à Devoxx France

63
Spring est mort,Vive Spring by Gildas Cuisinier @gcuisinier 1 samedi 21 avril 2012

description

Présentation lors de Devoxx France 2012

Transcript of Spring est mort, Vive Spring à Devoxx France

Page 1: Spring est mort, Vive Spring à Devoxx France

Spring est mort, Vive Springby Gildas Cuisinier

@gcuisinier

1samedi 21 avril 2012

Page 2: Spring est mort, Vive Spring à Devoxx France

Agenda

• Episode 1 : Un nouvel espoir

• Episode 2 : Le JCP contre-attaque

• Episode 3 : Le retour du Printemps

2samedi 21 avril 2012

Page 3: Spring est mort, Vive Spring à Devoxx France

Gildas Cuisinier

• @gcuisinier

• Maitre Artisan Développeur @ Sfeir Benelux

• Evangéliste Spring depuis plusieurs année

3samedi 21 avril 2012

Page 4: Spring est mort, Vive Spring à Devoxx France

Episode i ( ou iv )

Un nouvel espoir

4samedi 21 avril 2012

Page 5: Spring est mort, Vive Spring à Devoxx France

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

Page 6: Spring est mort, Vive Spring à Devoxx France

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

Page 7: Spring est mort, Vive Spring à Devoxx France

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

Page 8: Spring est mort, Vive Spring à Devoxx France

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

Page 9: Spring est mort, Vive Spring à Devoxx France

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

Page 10: Spring est mort, Vive Spring à Devoxx France

Première évolution

10

<beans>

<import resource="jedis.xml" />

<import resource="sabres.xml" />

<import resource="siths.xml" />

</beans>

samedi 21 avril 2012

Page 11: Spring est mort, Vive Spring à Devoxx France

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

Page 12: Spring est mort, Vive Spring à Devoxx France

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

Page 13: Spring est mort, Vive Spring à Devoxx France

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

Page 14: Spring est mort, Vive Spring à Devoxx France

Episode ii ( ou v )

Le JCP contre-attaque

14samedi 21 avril 2012

Page 15: Spring est mort, Vive Spring à Devoxx France

JEE 6 à nouveau sexy

• Simplicité

• Testabilité

• Légèreté

MAIS

• Nécessite une migration

15samedi 21 avril 2012

Page 16: Spring est mort, Vive Spring à Devoxx France

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

Page 17: Spring est mort, Vive Spring à Devoxx France

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

Page 18: Spring est mort, Vive Spring à Devoxx France

JEE 6, la mort de Spring ?

18

cyg.be/SpringJEE

samedi 21 avril 2012

Page 19: Spring est mort, Vive Spring à Devoxx France

19

27%

56%

13%4%

None J2EE 14 JEE 5 JEE 6

cyg.be/SpringJEE

JEE en 2012

samedi 21 avril 2012

Page 20: Spring est mort, Vive Spring à Devoxx France

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

Page 21: Spring est mort, Vive Spring à Devoxx France

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

Page 22: Spring est mort, Vive Spring à Devoxx France

22

16%

37%21%

26%

En partie Ne se prononce pas Non Oui

cyg.be/SpringJEE

JEE - Nouvelle troupes

samedi 21 avril 2012

Page 23: Spring est mort, Vive Spring à Devoxx France

23

BILAN

• Spécification fin 2009

• JEE 6 commence à percer en production

• 25-30% actuellement

• > 50% d’ici 1 an

samedi 21 avril 2012

Page 24: Spring est mort, Vive Spring à Devoxx France

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

Page 25: Spring est mort, Vive Spring à Devoxx France

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

Page 26: Spring est mort, Vive Spring à Devoxx France

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

Page 27: Spring est mort, Vive Spring à Devoxx France

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

Page 28: Spring est mort, Vive Spring à Devoxx France

Episode iii ( ou vi )

Le retour du Printemps

28samedi 21 avril 2012

Page 29: Spring est mort, Vive Spring à Devoxx France

AméliorationNoXML

29samedi 21 avril 2012

Page 30: Spring est mort, Vive Spring à Devoxx France

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

Page 31: Spring est mort, Vive Spring à Devoxx France

@ComponentScan

31

1 @Configuration2 @ComponentScan("spring")3 public class ApplicationConfig

1 <context:component-scan base-package="spring"/>

samedi 21 avril 2012

Page 32: Spring est mort, Vive Spring à Devoxx France

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

Page 33: Spring est mort, Vive Spring à Devoxx France

@EnableScheduling

33

1 @Configuration2 @EnableScheduling3 public class ApplicationConfig {4 }

1 <task:annotation-driven />

samedi 21 avril 2012

Page 34: Spring est mort, Vive Spring à Devoxx France

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

Page 35: Spring est mort, Vive Spring à Devoxx France

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

Page 36: Spring est mort, Vive Spring à Devoxx France

36

1 <mvc:annotation-driven />

1 @Configuration2 @EnableWebMvc3 public class WebConfig {4 }

@EnableWebMvc

samedi 21 avril 2012

Page 37: Spring est mort, Vive Spring à Devoxx France

37

1 <mvc:annotation-driven/>2 <mvc:interceptors>3 <bean class="osf..LocaleChangeInterceptor"/>4 </mvc:interceptors>

@EnableWebMvc

samedi 21 avril 2012

Page 38: Spring est mort, Vive Spring à Devoxx France

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

Page 39: Spring est mort, Vive Spring à Devoxx France

39

Ajout Intercepteur

Configuration de ViewController

Ajout de ResourceHandler

Ne permet pas une configuration fine

➡@EnableWebMvc et étendre WebMvcConfigurationSupport

@EnableWebMvc

samedi 21 avril 2012

Page 40: Spring est mort, Vive Spring à Devoxx France

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

Page 41: Spring est mort, Vive Spring à Devoxx France

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

Page 42: Spring est mort, Vive Spring à Devoxx France

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

Page 43: Spring est mort, Vive Spring à Devoxx France

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

Page 44: Spring est mort, Vive Spring à Devoxx France

Nouveau pouvoir :Cacher des resources

44samedi 21 avril 2012

Page 45: Spring est mort, Vive Spring à Devoxx France

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

Page 46: Spring est mort, Vive Spring à Devoxx France

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

Page 47: Spring est mort, Vive Spring à Devoxx France

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

Page 48: Spring est mort, Vive Spring à Devoxx France

48

1 <caching:annotation-driven />2 3 <bean class="org.springframework.cache .concurrent.ConcurrentMapCacheManager"/>4

@EnableCaching

samedi 21 avril 2012

Page 49: Spring est mort, Vive Spring à Devoxx France

• Out of the Box

✓ConcurrentHashMap

✓ EhCache

• GemFire

49

Abstraction de Cache

samedi 21 avril 2012

Page 50: Spring est mort, Vive Spring à Devoxx France

50

Nouveau pouvoir

Adaptation au terrain

samedi 21 avril 2012

Page 51: Spring est mort, Vive Spring à Devoxx France

51

• Séparation entre l’utilisation d’une ressource et sa définition

• Inadapté pour une configuration différente

JNDI

samedi 21 avril 2012

Page 52: Spring est mort, Vive Spring à Devoxx France

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

Page 53: Spring est mort, Vive Spring à Devoxx France

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

Page 54: Spring est mort, Vive Spring à Devoxx France

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

Page 55: Spring est mort, Vive Spring à Devoxx France

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

Page 56: Spring est mort, Vive Spring à Devoxx France

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

Page 57: Spring est mort, Vive Spring à Devoxx France

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

Page 58: Spring est mort, Vive Spring à Devoxx France

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

Page 59: Spring est mort, Vive Spring à Devoxx France

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

Page 60: Spring est mort, Vive Spring à Devoxx France

Security

Batch

FrameworkIntegration

SpringData SpringMobile

SpringAndroid SpringSocialFlex

60

L’Univers de Spring

samedi 21 avril 2012

Page 61: Spring est mort, Vive Spring à Devoxx France

Conclusion

• Spring est largement répandu

• Spring continue à évoluer

✓ NoXML

✓ Ouvert au Cloud

• Spring est un écosystème

61samedi 21 avril 2012

Page 63: Spring est mort, Vive Spring à Devoxx France

Sources des images

63

http://www.thegeekshowpodcast.com

http://www.thinkgeek.com

http://gadgetsin.com

raven - Fotolia.com

samedi 21 avril 2012