Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Spring<XML> est mort, vive Spring NoXML
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Gildas Cuisinier
November 13, 2012
Programming
150
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Spring<XML> est mort, vive Spring NoXML
Gildas Cuisinier
November 13, 2012
More Decks by Gildas Cuisinier
See All by Gildas Cuisinier
10 command line tools to improve your day !
gcuisinier
0
110
WaJUG - Introduction à Docker
gcuisinier
0
370
Other Decks in Programming
See All in Programming
T3DD26: From RAGs to Riches
martinhelmich
0
130
AI時代に学ぶ 好きなルール 嫌いなルール Linter編
shorty5121
0
770
kubernetes コンポーネント開発入門 / 新卒N年目の勉強会&交流会!〜〇〇への誘い〜 #n_study
mazrean
0
140
Hello, Hiroshima Geospatial Data! — Exploring DoboX with Python
ra0kley
0
160
LL言語やWebフレームワークのPostgreSQL対応 〜DBの機能がユーザーに届くまで〜
kentaroutakeda
0
130
Hono + Inertia + React で LP を構築した話
oukayuka
2
200
週末にAI-DLCを本気で回したら$1,600溶けた
hbashimizu
0
120
バグを直したら useEffect が消えた
colorful12
3
820
PyO3 で既存 Python 評価器を Rust core 化する ー wasm-bindgen でブラウザにも配るための設計
kdash
1
270
Kiroで創り、AgentCoreで繋ぐ!AWSで実践する「AI-DLC」から「AIエージェント統合」までの最新地図
licux
1
200
Seeing Through Serverless: Observability for AWS Lambda with ADOT and CloudWatch Application Signals
seike460
PRO
1
110
PyConJP2026_wat_Python × Signal Processing: How to Draw Pictures with Sound Using Spectrogram Art
wat
0
650
Featured
See All Featured
Rails Girls Zürich Keynote
gr2m
96
14k
Optimising Largest Contentful Paint
csswizardry
37
3.9k
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
133
19k
Effective software design: The role of men in debugging patriarchy in IT @ Voxxed Days AMS
baasie
0
500
How to Align SEO within the Product Triangle To Get Buy-In & Support - #RIMC
aleyda
2
1.8k
RailsConf 2023
tenderlove
30
1.5k
Breaking role norms: Why Content Design is so much more than writing copy - Taylor Woolridge
uxyall
1
390
From π to Pie charts
rasagy
0
350
How to Build an AI Search Optimization Roadmap - Criteria and Steps to Take #SEOIRL
aleyda
1
2.2k
Leveraging LLMs for student feedback in introductory data science courses - posit::conf(2025)
minecr
1
370
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
287
14k
Transcript
par Gildas Cuisinier @gcuisinier Spring<XML> est mort Vive Spring NoXML
jeudi 15 novembre 2012
Maître Artisan Développeur, Sfeir Benelux Initiateur de la section Spring
de @Developpez.com Relecteur de plusieurs livres sur Spring Evangéliste Spring ( JUGs, Devoxx France ) whois(@gcuisinier) jeudi 15 novembre 2012
Injection de dépendances AOP Abstraction de services Spring ? jeudi
15 novembre 2012
Retour en 2004 jeudi 15 novembre 2012
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 /> jeudi 15 novembre 2012
Spring 1.2 1 <bean id="monBean" class="be.hikage.service.MyService"> 2 <property name="version" value="maVersion"/>
3 </bean> 4 5 <import resource="service-layer.xml"/> 6 <import resource="dao-layer.xml"/> 7 <import resource="disp-layer.xml"/> jeudi 15 novembre 2012
Spring 1.2 jeudi 15 novembre 2012
1 <bean id="filterChainProxy" 2 class="org.acegisecurity.util.FilterChainProxy"> 3 <property name="filterInvocationDefinitionSource"> 4 <value>
5 CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON 6 PATTERN_TYPE_APACHE_ANT 7 /login= 8 httpSessionContextIntegrationFilter 9 /login.form= 10 httpSessionContextIntegrationFilter 11 /assets/**= 12 httpSessionContextIntegrationFilter 13 /j_acegi_security_check= 14 httpSessionContextIntegrationFilter, 15 formAuthenticationProcessingFilter 16 /**= 17 httpSessionContextIntegrationFilter, 18 exceptionTranslationFilter 19 </value> 20 </property> 21 </bean> 22 <bean id="httpSessionContextIntegrationFilter" 23 class="org.acegisecurity...HttpSessionContextIntegrationFilter"> 24 </bean> 25 26 <bean id="formLoginAuthenticationEntryPoint" 27 class="org.acegisecurity...AuthenticationProcessingFilterEntryPoint"> 28 <property name="loginFormUrl" value="/login"/> 29 <property name="forceHttps" value="false"/> 30 </bean> jeudi 15 novembre 2012
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"/> 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> jeudi 15 novembre 2012
1 @Controller 2 public class MyController { 3 4 private
MyService myService; 5 6 @Autowired 7 public void setMyService(MyService myService) { 8 this.myService = myService; 9 } 10 11 } Spring 2.5 1 <context:component-scan base-package="be.hikage" /> jeudi 15 novembre 2012
Spring 3.0 1 @Configuration 2 public class ApplicationConfig { 3
4 @Bean 5 public MyService myService() { 6 return new MyService(); 7 } 8 9 } jeudi 15 novembre 2012
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) jeudi 15 novembre 2012
Spring 3.0 1 @Component 2 public class MyTask { 3
4 @Scheduled(cron="* * * * *") 5 public void execute() { 6 // code 7 } 8 9 } 1 <context:component-scan base-package="be.hikage" /> 2 <task:annotation-driven scheduler="myScheduler" .. /> jeudi 15 novembre 2012
Spring 3.1 @nnotations ++ jeudi 15 novembre 2012
1 <context:component-scan base-package="be.hikage"/> 1 @Configuration 2 @ComponentScan("be.hikage") 3 public class
ApplicationConfig @ComponentScan jeudi 15 novembre 2012
1 public class MaTache { 2 3 @Scheduled(fixedRate = 1000)
4 public void execute() { 5 System.out.println("Maman, je parle au ParisJUG"); 6 } 7 } @EnableScheduling jeudi 15 novembre 2012
1 @Configuration 2 @EnableScheduling 3 public class ApplicationConfig { 4
} 1 <task:annotation-driven /> @EnableScheduling jeudi 15 novembre 2012
1 @Target(ElementType.TYPE) 2 @Retention(RetentionPolicy.RUNTIME) 3 @Import(SchedulingConfiguration.class) 4 @Documented 5 public
@interface EnableScheduling { 6 7 } @EnableScheduling jeudi 15 novembre 2012
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 jeudi 15 novembre 2012
1 @Service 2 public class CalculateurPrix { 3 4 @Cacheable(value
= "price") 5 public Double calculePrix(String reference){ 6 // calcul long et complexe 7 return 42L; 8 } 9 10 11 12 13 14 } @EnableCaching jeudi 15 novembre 2012
1 @Service 2 public class CalculateurPrix { 3 4 @Cacheable(value
= "price") 5 public Double calculePrix(String reference){ 6 // calcul long et complexe 7 return 42L; 8 } 9 10 @CacheEvict(value = "price",allEntries = true) 11 public void setRistourne(Float indice){ 12 13 } 14 } @EnableCaching jeudi 15 novembre 2012
1 <caching:annotation-driven /> 2 3 <bean class="org.springframework.cache .concurrent.ConcurrentMapCacheManager"/> 4 @EnableCaching
jeudi 15 novembre 2012
1 @Configuration 2 @EnableCaching 3 public class ApplicationConfig { 4
5 @Bean 6 CacheManager cacheManager(){ 7 return 8 new ConcurrentMapCacheManager(); 9 } 10 } @EnableCaching jeudi 15 novembre 2012
Abstraction de Cache Out of the Box ConcurrentHashMap EhCache GemFire
JCache (Spring 3.2/3.3) jeudi 15 novembre 2012
@EnableWebMvc 1 <mvc:annotation-driven /> 1 @Configuration 2 @EnableWebMvc 3 public
class WebConfig { 4 } jeudi 15 novembre 2012
@EnableWebMvc 1 <mvc:annotation-driven/> 2 <mvc:interceptors> 3 <bean class="osf..LocaleChangeInterceptor"/> 4 </mvc:interceptors>
jeudi 15 novembre 2012
@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 } jeudi 15 novembre 2012
@EnableWebMvc Ajout Intercepteur Configuration de ViewController Ajout de ResourceHandler Ne
permet pas une configuration fine ➡@EnableWebMvc et étendre WebMvcConfigurationSupport jeudi 15 novembre 2012
@Enable* EnableAsync EnableAspectJAutoProxy EnableSpringConfigured EnableLoadTimeWeaving EnableTransactionManagement jeudi 15 novembre 2012
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 } jeudi 15 novembre 2012
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 } jeudi 15 novembre 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 Servlet 3.0 jeudi 15 novembre 2012
DEMO jeudi 15 novembre 2012
Spring 3.1 bis jeudi 15 novembre 2012
@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 } jeudi 15 novembre 2012
<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> jeudi 15 novembre 2012
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> jeudi 15 novembre 2012
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> jeudi 15 novembre 2012
Spring 3.1, c’est aussi Support Hibernate 4 Namespace c: JPA
sans Persistence.xml ... jeudi 15 novembre 2012
Spring 3.2 jeudi 15 novembre 2012
Spring 3.2 RC1 - Release début Novembre Principalement des améliorations
de l’existant Support des contrôleurs asynchrones dans WebMVC Amélioration du testing (REST, MVC) Release prévue pour le 12/12/12 ;-) Spring 3.3 JEE 7 : JPA 2.1, Bean Validation 1.1, JMS 2 Spring 3.2 jeudi 15 novembre 2012
Spring est mort ? jeudi 15 novembre 2012
Spring en 2003 Framework jeudi 15 novembre 2012
Spring en 2012 Framework Security Batch Integration Flex SpringData SpringMobile
SpringAndroid SpringSocial jeudi 15 novembre 2012
Conclusions jeudi 15 novembre 2012
Questions ? jeudi 15 novembre 2012