Spring 3.1 introduced several eagerly awaited features including bean definition profiles (a.k.a., environment-specific configuration), enhanced Java-based application and infrastructure configuration (a la XML namespaces), and a new cache abstraction. This session will provide attendees a high-level overview of these major new features plus a quick look at additional enhancements to the framework such as the new c: namespace for constructor arguments, support for Servlet 3.0, improvements to Spring MVC and REST, and Spring's new integration testing support for profiles and configuration classes. In addition, this talk will introduce new features under development in the Spring 3.2 roadmap.
1. Spring 3.1 to 3.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”
15. 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
17. 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.
19. PropertySource(s)
– PropertySource
• a single property source
– PropertySources
• a hierarchy of PropertySource objects
• potentially varying across deployment environments
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
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
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
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
39. New Testing Features in 3.1
– @Configuration class support
– Environment profile support
– SmartContextLoader
– AnnotationConfigContextLoader
– DelegatingSmartContextLoader
– Updated context cache key generation
40. SmartContextLoader SPI
– Supersedes ContextLoader
– Strategy for loading application contexts
– From @Configuration classes or resource
locations
– Supports environment profiles
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.
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.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?
55. @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
56. A More Complete Example …
– Add component scanning for @Controllers
and other beans
57. Q: Where is the “Enabled”
Configuration ?!
– A: a framework-provided @Configuration class
(actually DelegatingWebMvcConfiguration)
58. How Do I Customize 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 in the Model
– @PathVariable arguments automatically
added to the model
These can be deleted
61. URI Templates in Redirect Strings
– URL templates supported in “redirect:”
strings
Expanded from model attributes,
which now include @PathVariables
62. URI Template Vars in Data Binding
– URI template variables used in data binding
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)
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
70. "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
71. 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
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 Async Requests
• 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 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
77. Validation
• Bean Validation 1.1 (JSR-349)
– Specification compatibility
– Building on 1.0 support in Spring 3.0
• SPR-8199
78. 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
79. 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
81. Further Resources
• Spring Framework
– http://springframework.org
– Spring Reference Manual
– JavaDoc
• Spring Forums
– http://forum.springframework.org
• Spring JIRA
– http://jira.springframework.org
82. Blogs
• SpringSource Team Blog – category 3.1
– http://blog.springsource.com/category/spring/31/
• Swiftmind Blog
– http://www.swiftmind.com/blog/