Spring 3.1 to 3.2
  in a Nutshell
   Sam Brannen
    Swiftmind
Speaker Profile
•   Spring & Java consultant @ Swiftmind
•   Developing Java for over 14 years
•   Spring Framework Core Developer
•   Spring Trainer
•   Lead author of “Spring in a Nutshell”
Show of hands…
Agenda
•   Major Themes in 3.x
•   Environment and Profiles
•   Java-based Configuration
•   Testing
•   Caching
•   MVC and REST
•   Servlet 3.0
•   3.2 Roadmap
Major Themes in Spring 3.0
Java-based configuration
custom stereotypes
annotated factory methods
JSR-330 – DI for Java
Spring Expression Language
REST support in Spring MVC
Portlet API 2.0
JSR-303 – bean validation
Java EE 6 support: JPA 2.0, JSF 2.0
Major Themes in Spring 3.1
– Environment abstraction
– Java-based application configuration
– @Configuration class test support
– High-level cache API
– Customizable @MVC processing
– Flash maps and redirect attributes
– Explicit support for Servlet 3.0
Environment and Profiles
Environment Abstraction
– Injectable environment abstraction API
     • org.springframework.core.env.Environment

– Two core concepts
     • Property Sources
     • Bean Profiles


Property Source:                  Bean Profile:

A variety of sources: property    A logical group of bean
files, system properties,         definitions. Registered only if
servlet context, JNDI, etc.       the profile is active.
Property Source Abstraction
– Property source

– Property resolution

– Placeholders
PropertySource(s)
– PropertySource
  • a single property source


– PropertySources
  • a hierarchy of PropertySource objects
  • potentially varying across deployment environments
Property Resolution SPI

– org.springframework.core.env.PropertyResolver

– Environment extends PropertyResolver
Custom Placeholder Resolution

– dependent on the actual environment

– PropertySourcesPlaceholderConfigurer
  supersedes PropertyPlaceholderConfigurer
Managing Property Sources
– Stand-alone code




– Web application
  • Implement ApplicationContextInitializer
  • Register via contextInitializerClasses context parameter in
    web.xml
Accessing Properties
– By injecting the Environment
Bean Definition Profiles
– Logical grouping of bean definitions
  • for activation in specific environments
  • e.g., dev, staging, prod
  • possibly different deployment platforms


– Configuration
  • XML via <beans profile=“…”>
  • Java-based configuration via @Profile
Configuring Profiles in XML
– All bean definitions




– Subset of bean definitions
Configuring Profiles in Java Config




– @Profile can also be used on components
  • @Component, @Service, @Repository, etc.   26
Profile Activation Options
– programmatically

– system property

– in web.xml

– in tests via @ActiveProfiles
Activating Profiles…
 programmatically
Activating Profiles…
       via system properties


-Dspring.profiles.active=“dev”

-Dspring.profiles.default=“common”
Activating Profiles…
    in web apps
Activating Profiles…
 in integration tests
Java-based Configuration
Java Config ~= XML
– XML namespaces  @Enable*
– FactoryBeans  builders
– GenericXmlContextLoader 
  AnnotationConfigContextLoader

– Not a one-to-one mapping
  • Make the most of what Java has to offer
  • Intuitive annotation-oriented container configuration
Typical Infrastructure Setup
– Transactions

– Scheduling

– MVC customization

– AOP
@Enable* Annotations
– Applied at the class-level on @Configuration
  classes

– Roughly equivalent to their XML namespace
  counterparts
@Enable* in 3.1
– @EnableTransactionManagement
– @EnableCaching
– @EnableAsync
– @EnableScheduling
– @EnableAspectJAutoProxy
– @EnableLoadTimeWeaving
– @EnableSpringConfigured
– @EnableWebMvc
Hibernate and JPA
– Hibernate LocalSessionFactoryBuilder API
  • Hibernate 4 replacement for both
    LocalSessionFactoryBean and
    AnnotationSessionFactoryBean


– XML-free JPA configuration
  • LocalContainerEntityManagerFactoryBean has a
    new property
  • packagesToScan: analogous to
    AnnotationSessionFactoryBean
Java Configuration Example


                 Actually:
                 LocalSessionFactoryBuilder
New Testing Features in 3.1
– @Configuration class support
– Environment profile support
– SmartContextLoader
– AnnotationConfigContextLoader
– DelegatingSmartContextLoader
– Updated context cache key generation
SmartContextLoader SPI
– Supersedes ContextLoader
– Strategy for loading application contexts
– From @Configuration classes or resource
  locations
– Supports environment profiles
@ContextConfiguration
accepts a new `classes` attribute...
Ex: @Configuration Test #1
Ex: @Configuration Test #2
Caching
Caching Abstraction
– Declarative caching for Spring applications
  • Minimal impact on code
  • Plug in various caching solutions
Caching Abstraction
– Key annotations
  • @Cacheable
  • @CacheEvict
Cache Key
– All method arguments used by default




– Use SpEL to select more specifically (use
  class, method, or argument name)
Conditional Caching
Cache Providers (1/2)
– Cache and CacheManager SPI
  • org.springframework.cache


– Cache Implementations
  • EhCacheCache
  • ConcurrentMapCache and
    ConcurrentMapCacheFactoryBean
Cache Providers (2/2)
– CacheManager Implementations
  •   EhCacheCacheManager
  •   ConcurrentMapCacheManager
  •   SimpleCacheManager
  •   NoOpCacheManager


– Any other implementation can be plugged in
  • GemFire, Coherence, etc.
Cache Configuration
– Cache namespace
  • <cache:annotation-driven />
  • “cacheManager” bean
MVC and REST
@MVC 3.0 Config
– Built-in defaults
  • Based on DispatcherServlet.properties

– Spring MVC namespace
  • <mvc:annotation:driven>, <mvc:interceptors>, …
Java-based @MVC 3.1 Config
– Most Spring MVC configuration is in Java already
   • @Controller, @RequestMapping, etc.

– Servlet 3.0 enhancements will further reduce the
  need for web.xml

– XML namespace is convenient but …
   • Not transparent
   • Not easy to offer the right degree of customization



– … What should a Java equivalent to the MVC
  namespace look like?
@EnableWebMvc
– Enables Spring MVC default configuration
  • Registers components expected by the
    DispatcherServlet




– Allows for configuration similar to the
  Spring MVC namespace
  • … and the DispatcherServlet.properties combined
A More Complete Example …
– Add component scanning for @Controllers
  and other beans
Q: Where is the “Enabled”
        Configuration ?!
– A: a framework-provided @Configuration class
  (actually DelegatingWebMvcConfiguration)
How Do I Customize All This?
– Simply implement the WebMvcConfigurer
  interface
                              Allows selective overriding
HandlerMethod Abstraction
– HandlerMethod
   • A proper abstraction for the selected “handler” in Spring MVC

– Not just for @RequestMapping methods
   • Also @InitBinder, @ModelAttribute, @ExceptionHandler
     methods

– “HandlerMethod” support classes
   • RequestMappingHandlerMapping
   • RequestMappingHandlerAdapter
   • ExceptionHandlerExceptionResolver
Path Variables in the Model
– @PathVariable arguments automatically
  added to the model




                            These can be deleted
URI Templates in Redirect Strings
– URL templates supported in “redirect:”
  strings




                  Expanded from model attributes,
                 which now include @PathVariables
URI Template Vars in Data Binding
– URI template variables used in data binding
Matching MediaTypes < @MVC 3.1
  – Using the 'headers' condition
Matching MediaTypes in @MVC 3.1
  – The 'consumes' and 'produces' conditions



                   If not matched, results in:
                   UNSUPPORTED_MEDIA_TYPE (415)




                          If not matched, results in:
                          NOT_ACCEPTABLE (406)
Servlet 3.0
Servlet 3.0 Containers

• Tomcat 7 and GlassFish 3
  – Explicitly supported

• While preserving compatibility with Servlet
  2.4+
XML-free Web-app Config
• Support for XML-free web application setup
  – no web.xml


• Made possible via:
  – Servlet 3.0's ServletContainerInitializer
  – Spring 3.1's
    AnnotationConfigWebApplicationContext
  – Spring 3.1’s environment abstraction
Native Servlet 3.0 in @MVC
• Asynchronous request processing

• Standard Servlet 3.0 file upload
  – behind Spring's MultipartResolver abstraction
Bonus
"c:" Namespace
– Shortcut for <constructor-arg>
  • inline argument values
  • analogous to existing "p:" namespace
– Use of constructor argument names
  • recommended for readability
  • debug symbols have to be available in the
    application's class files
Spring 3.1 in a Nutshell
•   Environment and Profiles
•   Java-based Configuration and @Enable*
•   Testing with @Configuration and Profiles
•   Cache Abstraction
•   MVC and REST Improvements
•   Servlet 3.0
•   c: Namespace
Spring 3.2 Roadmap
Build System & Source Control
• Moved from Subversion to Git(hub)
  – Spring 3.1.1
  – github.com/SpringSource/spring-framework

• Moving from Spring Build (i.e., Ant + Ivy) to
  Gradle

• SPR-8120
Servlet 3.0/3.1 Async Requests
• Servlet 3.0/3.1 asynchronous request
  processing
  – Explicit support in Spring @MVC


• SPR-8517
Java EE 7
• JPA 2.1 (JSR-338)
   – Building on JPA 2.0 support in Spring 3.0
   – SPR-8194

• JSF 2.2 (JSR-344)
   – Specification compatibility
   – SPR-8104

• JMS 2.0 (JSR-343)
   – Long overdue, major overhaul to JMS
   – Exploring a native JMS API style for use with Spring
   – SPR-8197
Caching
• Support for JCache (JSR-107) compliant cache providers
   – JCacheCacheManager/Cache adapters for Spring's SPI
   – JCacheManager/JCacheFactoryBean

• Support for JCache's standardized caching annotations
   – ideally automatically through Spring’s
     <cache:annotation-driven>

• SPR-8774
Validation
• Bean Validation 1.1 (JSR-349)
  – Specification compatibility
  – Building on 1.0 support in Spring 3.0


• SPR-8199
Spring Core
• Migrate from CGLIB to Javassist
   – For class-based proxies (AOP)
   – SPR-8190


• Bean definition visibility and overriding
   –   Final bean definitions
   –   Profile-scoped beans
   –   @Bean methods override XML beans
   –   SPR-8189
Spring MVC Testing Support
• Unit tests with Mock MVC classes
  – Simulates the DispatcherServlet


• Integration tests with XmlWebApplicationContext
  – Configured via @ContextConfiguration and other
    annotations
  – Loaded via a new ContextLoader
In Closing…
Further Resources
• Spring Framework
  – http://springframework.org
  – Spring Reference Manual
  – JavaDoc
• Spring Forums
  – http://forum.springframework.org
• Spring JIRA
  – http://jira.springframework.org
Blogs
• SpringSource Team Blog – category 3.1
  – http://blog.springsource.com/category/spring/31/


• Swiftmind Blog
  – http://www.swiftmind.com/blog/
Q&A

Sam Brannen

twitter: @sam_brannen
www.slideshare.net/sbrannen
www.swiftmind.com


“Spring in a Nutshell”
       http://oreilly.com/catalog/9780596801946
      available from O’Reilly in 2012

Spring 3.1 to 3.2 in a Nutshell - Spring I/O 2012

  • 1.
    Spring 3.1 to3.2 in a Nutshell Sam Brannen Swiftmind
  • 2.
    Speaker Profile • Spring & Java consultant @ Swiftmind • Developing Java for over 14 years • Spring Framework Core Developer • Spring Trainer • Lead author of “Spring in a Nutshell”
  • 3.
  • 4.
    Agenda • Major Themes in 3.x • Environment and Profiles • Java-based Configuration • Testing • Caching • MVC and REST • Servlet 3.0 • 3.2 Roadmap
  • 5.
    Major Themes inSpring 3.0
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
    REST support inSpring MVC
  • 12.
  • 13.
  • 14.
    Java EE 6support: JPA 2.0, JSF 2.0
  • 15.
    Major Themes inSpring 3.1 – Environment abstraction – Java-based application configuration – @Configuration class test support – High-level cache API – Customizable @MVC processing – Flash maps and redirect attributes – Explicit support for Servlet 3.0
  • 16.
  • 17.
    Environment Abstraction – Injectableenvironment abstraction API • org.springframework.core.env.Environment – Two core concepts • Property Sources • Bean Profiles Property Source: Bean Profile: A variety of sources: property A logical group of bean files, system properties, definitions. Registered only if servlet context, JNDI, etc. the profile is active.
  • 18.
    Property Source Abstraction –Property source – Property resolution – Placeholders
  • 19.
    PropertySource(s) – PropertySource • a single property source – PropertySources • a hierarchy of PropertySource objects • potentially varying across deployment environments
  • 20.
    Property Resolution SPI –org.springframework.core.env.PropertyResolver – Environment extends PropertyResolver
  • 21.
    Custom Placeholder Resolution –dependent on the actual environment – PropertySourcesPlaceholderConfigurer supersedes PropertyPlaceholderConfigurer
  • 22.
    Managing Property Sources –Stand-alone code – Web application • Implement ApplicationContextInitializer • Register via contextInitializerClasses context parameter in web.xml
  • 23.
    Accessing Properties – Byinjecting the Environment
  • 24.
    Bean Definition Profiles –Logical grouping of bean definitions • for activation in specific environments • e.g., dev, staging, prod • possibly different deployment platforms – Configuration • XML via <beans profile=“…”> • Java-based configuration via @Profile
  • 25.
    Configuring Profiles inXML – All bean definitions – Subset of bean definitions
  • 26.
    Configuring Profiles inJava Config – @Profile can also be used on components • @Component, @Service, @Repository, etc. 26
  • 27.
    Profile Activation Options –programmatically – system property – in web.xml – in tests via @ActiveProfiles
  • 28.
  • 29.
    Activating Profiles… via system properties -Dspring.profiles.active=“dev” -Dspring.profiles.default=“common”
  • 30.
  • 31.
  • 32.
  • 33.
    Java Config ~=XML – XML namespaces  @Enable* – FactoryBeans  builders – GenericXmlContextLoader  AnnotationConfigContextLoader – Not a one-to-one mapping • Make the most of what Java has to offer • Intuitive annotation-oriented container configuration
  • 34.
    Typical Infrastructure Setup –Transactions – Scheduling – MVC customization – AOP
  • 35.
    @Enable* Annotations – Appliedat the class-level on @Configuration classes – Roughly equivalent to their XML namespace counterparts
  • 36.
    @Enable* in 3.1 –@EnableTransactionManagement – @EnableCaching – @EnableAsync – @EnableScheduling – @EnableAspectJAutoProxy – @EnableLoadTimeWeaving – @EnableSpringConfigured – @EnableWebMvc
  • 37.
    Hibernate and JPA –Hibernate LocalSessionFactoryBuilder API • Hibernate 4 replacement for both LocalSessionFactoryBean and AnnotationSessionFactoryBean – XML-free JPA configuration • LocalContainerEntityManagerFactoryBean has a new property • packagesToScan: analogous to AnnotationSessionFactoryBean
  • 38.
    Java Configuration Example Actually: LocalSessionFactoryBuilder
  • 39.
    New Testing Featuresin 3.1 – @Configuration class support – Environment profile support – SmartContextLoader – AnnotationConfigContextLoader – DelegatingSmartContextLoader – Updated context cache key generation
  • 40.
    SmartContextLoader SPI – SupersedesContextLoader – Strategy for loading application contexts – From @Configuration classes or resource locations – Supports environment profiles
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
    Caching Abstraction – Declarativecaching for Spring applications • Minimal impact on code • Plug in various caching solutions
  • 46.
    Caching Abstraction – Keyannotations • @Cacheable • @CacheEvict
  • 47.
    Cache Key – Allmethod arguments used by default – Use SpEL to select more specifically (use class, method, or argument name)
  • 48.
  • 49.
    Cache Providers (1/2) –Cache and CacheManager SPI • org.springframework.cache – Cache Implementations • EhCacheCache • ConcurrentMapCache and ConcurrentMapCacheFactoryBean
  • 50.
    Cache Providers (2/2) –CacheManager Implementations • EhCacheCacheManager • ConcurrentMapCacheManager • SimpleCacheManager • NoOpCacheManager – Any other implementation can be plugged in • GemFire, Coherence, etc.
  • 51.
    Cache Configuration – Cachenamespace • <cache:annotation-driven /> • “cacheManager” bean
  • 52.
  • 53.
    @MVC 3.0 Config –Built-in defaults • Based on DispatcherServlet.properties – Spring MVC namespace • <mvc:annotation:driven>, <mvc:interceptors>, …
  • 54.
    Java-based @MVC 3.1Config – Most Spring MVC configuration is in Java already • @Controller, @RequestMapping, etc. – Servlet 3.0 enhancements will further reduce the need for web.xml – XML namespace is convenient but … • Not transparent • Not easy to offer the right degree of customization – … What should a Java equivalent to the MVC namespace look like?
  • 55.
    @EnableWebMvc – Enables SpringMVC default configuration • Registers components expected by the DispatcherServlet – Allows for configuration similar to the Spring MVC namespace • … and the DispatcherServlet.properties combined
  • 56.
    A More CompleteExample … – Add component scanning for @Controllers and other beans
  • 57.
    Q: Where isthe “Enabled” Configuration ?! – A: a framework-provided @Configuration class (actually DelegatingWebMvcConfiguration)
  • 58.
    How Do ICustomize All This? – Simply implement the WebMvcConfigurer interface Allows selective overriding
  • 59.
    HandlerMethod Abstraction – HandlerMethod • A proper abstraction for the selected “handler” in Spring MVC – Not just for @RequestMapping methods • Also @InitBinder, @ModelAttribute, @ExceptionHandler methods – “HandlerMethod” support classes • RequestMappingHandlerMapping • RequestMappingHandlerAdapter • ExceptionHandlerExceptionResolver
  • 60.
    Path Variables inthe Model – @PathVariable arguments automatically added to the model These can be deleted
  • 61.
    URI Templates inRedirect Strings – URL templates supported in “redirect:” strings Expanded from model attributes, which now include @PathVariables
  • 62.
    URI Template Varsin Data Binding – URI template variables used in data binding
  • 63.
    Matching MediaTypes <@MVC 3.1 – Using the 'headers' condition
  • 64.
    Matching MediaTypes in@MVC 3.1 – The 'consumes' and 'produces' conditions If not matched, results in: UNSUPPORTED_MEDIA_TYPE (415) If not matched, results in: NOT_ACCEPTABLE (406)
  • 65.
  • 66.
    Servlet 3.0 Containers •Tomcat 7 and GlassFish 3 – Explicitly supported • While preserving compatibility with Servlet 2.4+
  • 67.
    XML-free Web-app Config •Support for XML-free web application setup – no web.xml • Made possible via: – Servlet 3.0's ServletContainerInitializer – Spring 3.1's AnnotationConfigWebApplicationContext – Spring 3.1’s environment abstraction
  • 68.
    Native Servlet 3.0in @MVC • Asynchronous request processing • Standard Servlet 3.0 file upload – behind Spring's MultipartResolver abstraction
  • 69.
  • 70.
    "c:" Namespace – Shortcutfor <constructor-arg> • inline argument values • analogous to existing "p:" namespace – Use of constructor argument names • recommended for readability • debug symbols have to be available in the application's class files
  • 71.
    Spring 3.1 ina Nutshell • Environment and Profiles • Java-based Configuration and @Enable* • Testing with @Configuration and Profiles • Cache Abstraction • MVC and REST Improvements • Servlet 3.0 • c: Namespace
  • 72.
  • 73.
    Build System &Source Control • Moved from Subversion to Git(hub) – Spring 3.1.1 – github.com/SpringSource/spring-framework • Moving from Spring Build (i.e., Ant + Ivy) to Gradle • SPR-8120
  • 74.
    Servlet 3.0/3.1 AsyncRequests • Servlet 3.0/3.1 asynchronous request processing – Explicit support in Spring @MVC • SPR-8517
  • 75.
    Java EE 7 •JPA 2.1 (JSR-338) – Building on JPA 2.0 support in Spring 3.0 – SPR-8194 • JSF 2.2 (JSR-344) – Specification compatibility – SPR-8104 • JMS 2.0 (JSR-343) – Long overdue, major overhaul to JMS – Exploring a native JMS API style for use with Spring – SPR-8197
  • 76.
    Caching • Support forJCache (JSR-107) compliant cache providers – JCacheCacheManager/Cache adapters for Spring's SPI – JCacheManager/JCacheFactoryBean • Support for JCache's standardized caching annotations – ideally automatically through Spring’s <cache:annotation-driven> • SPR-8774
  • 77.
    Validation • Bean Validation1.1 (JSR-349) – Specification compatibility – Building on 1.0 support in Spring 3.0 • SPR-8199
  • 78.
    Spring Core • Migratefrom CGLIB to Javassist – For class-based proxies (AOP) – SPR-8190 • Bean definition visibility and overriding – Final bean definitions – Profile-scoped beans – @Bean methods override XML beans – SPR-8189
  • 79.
    Spring MVC TestingSupport • Unit tests with Mock MVC classes – Simulates the DispatcherServlet • Integration tests with XmlWebApplicationContext – Configured via @ContextConfiguration and other annotations – Loaded via a new ContextLoader
  • 80.
  • 81.
    Further Resources • SpringFramework – http://springframework.org – Spring Reference Manual – JavaDoc • Spring Forums – http://forum.springframework.org • Spring JIRA – http://jira.springframework.org
  • 82.
    Blogs • SpringSource TeamBlog – category 3.1 – http://blog.springsource.com/category/spring/31/ • Swiftmind Blog – http://www.swiftmind.com/blog/
  • 83.
    Q&A Sam Brannen twitter: @sam_brannen www.slideshare.net/sbrannen www.swiftmind.com “Springin a Nutshell” http://oreilly.com/catalog/9780596801946 available from O’Reilly in 2012