JAZOON'13 - Sam Brannen - Spring Framework 4.0 - The Next Generation
-
Upload
jazoon13 -
Category
Technology
-
view
1.109 -
download
1
Transcript of JAZOON'13 - Sam Brannen - Spring Framework 4.0 - The Next Generation
Spring Framework 4.0 The Next Generation
Sam Brannen @sam_brannen
• Spring and Java Consultant @ Swiftmind
• Java Developer for over 15 years
• Spring Framework Core Committer since 2007
• Spring Trainer
• Presenter on Spring, Java, OSGi, and testing
|
Sam Brannen
• Spring Framework
• Java EE
• OSGi
• Agile Methodologies
• Software Engineering Best Practices
|
Swiftmind: Areas of Expertise
• Zurich, Switzerland
• Twitter: @swiftmind
• http://www.swiftmind.com
|
Swiftmind: How to find us
|
A Show of Hands…
• Spring 3.x in Review
• Themes in 4.0
• Java EE
• Java SE
• Spring 4 on Java 8
|
Agenda
• Powerful annotated component model • stereotypes, configuration classes, composable
annotations, profiles
• Spring Expression Language • and its use in @Value injection
|
Spring 3.x: Component Model
• Comprehensive REST support • and other Spring @MVC additions
• Support for async MVC processing • Spring MVC interacting with Servlet 3.0 async
callbacks
|
Spring 3.x: Component Model
• Declarative validation and formatting • integration with JSR-303 Bean Validation
• Declarative scheduling • trigger abstraction and cron support
• Declarative caching • in-memory, Ehcache, etc.
|
Spring 3.x: Component Model
• Embedded databases via <jdbc /> namespace
• @Configuration classes & @ActiveProfiles
• @WebAppConfiguration
• @ContextHierarchy
• Spring MVC Test framework
|
Spring 3.x: Testing
• JSR-330 (Dependency Injection for Java) • @Inject, @Qualifier, Provider mechanism
• JSR-303 (Bean Validation 1.0) • declarative constraints • embedded validation engine
|
Spring 3.x: Key Specifications
• JPA 2.0 • persistence provider integration • Spring transactions
• Servlet 3.0 • web.xml-free deployment • async request processing
|
Spring 3.x: Key Specifications
|
Typical Annotated Component
• Combining meta-annotations on a custom stereotype • Automatically detected: no configuration necessary!
|
Composable Stereotypes
|
Configuration Classes
|
Spring 4.0 Themes
• Java SE 6+
• Java EE 6+ (Servlet 3.0 focused, Servlet 2.5
compatible)
• All deprecated packages removed
• Many deprecated methods removed as well
|
New Baseline
• Minimum versions ~ mid 2010 now
• For example • Hibernate 3.6+ • Quartz 1.8+ • Ehcache 2.1+
|
Third-party Libraries
• Lambda expressions
• Method references
• JSR-310 Date and Time
• Repeatable annotations
• Parameter name discovery
|
Java 8 Language & API Features
• A smooth out-of-the-box experience for
Groovy-based Spring applications
|
Groovy + Spring 4.0
• AOP adaptations • special handling of GroovyObject calls • consider a Spring application with all components
written in the Groovy language instead of Java
|
Groovy + Spring 4.0
• Groovy-based bean definitions • formerly known as the Bean Builder in Grails • now to live alongside Spring's configuration class
model
|
Groovy + Spring 4.0
• A generalized model for conditional bean
definitions • a more flexible and more dynamic variant of bean
definition profiles (as known from Spring 3.1) • can be used for smart defaulting • see Spring Boot J
|
Conditional Bean Definitions
• @Conditional with programmatic Condition
implementations • can react to rich context (existing bean definitions,
etc.) • profile support now simply a ProfileCondition
implementation class
|
Conditional Bean Definitions
• Custom annotations may override specific
attributes of meta-annotations
• Purely convention-based
• use of same attribute name
|
Annotation-based Components
@MyTransactional(readOnly=true)@MySessionScope(scopedProxyMode=TARGET_CLASS)
|
Annotation-based Components
• @Lazy on injection point
• Alternative to Provider<MyTargetType>
|
Lazy Resolution Proxies
• Ordered/@Order on candidate beans
• Relative order within specific injection result
|
Ordered Injection of Lists & Arrays
• Type matching based on full generic type • e.g. MyRepository<Customer>
• Generic factory methods supported in XML
config files • Mockito, EasyMock, etc.
|
DI and Generics
• New org.springframework.messaging module
• Extracted from Spring Integration
• Core message and channel abstractions
|
spring-messaging
• WebSocket endpoint model along the lines of
Spring MVC
• JSR-356 but also covering SockJS and STOMP
• Endpoints using generic messaging patterns
|
WebSockets
• Analogous to existing RestTemplate
• Based on ListenableFuture return values
|
AsyncRestTemplate
|
Spring and Java EE
• Spring 2.5 completed Java EE 5 support • J2EE 1.3 – Java EE 5
• Spring 3.0 introduced Java EE 6 support • J2EE 1.4 – Java EE 6
|
Java EE Support (1/2)
• Spring 3.1/3.2: strong Servlet 3.0 focus • J2EE 1.4 (deprecated) – Java EE 6
• Spring 4.0 introduces explicit Java EE 7 support • Java EE 5 (with JPA 2.0 feature pack) – Java EE 7
|
Java EE Support (2/2)
• JMS 2.0 • delivery delay, JMS 2.0 createSession() variants, etc.
• JTA 1.2 • javax.transaction.Transactional annotation
|
Enterprise APIs (1/2)
• JPA 2.1 • unsynchronized persistence contexts
• Bean Validation 1.1 • method parameter and return value constraints
|
Enterprise APIs (2/2)
|
Spring and Java SE
• Spring 2.5 introduced Java 6 support • JDK 1.4 – JDK 6
• Spring 3.0 raised the bar to Java 5+ • JDK 5 – JDK 6
|
Java SE Support (1/2)
• Spring 3.1/3.2: explicit Java 7 support • JDK 5 – JDK 7
• Spring 4.0 introduces explicit Java 8 support • JDK 6 – JDK 8
|
Java SE Support (2/2)
|
Java 8 Programming Model
• Delayed again...
• Scheduled for GA in September 2013
• Now just Developer Preview in September
• OpenJDK 8 GA as late as March 2014 (!)
|
The State of Java 8
• IntelliJ: available since IDEA 12, released in
Dec 2012
• Eclipse: announced for June 2014 (!)
• Spring Tool Suite: Eclipse-based beta support
earlier
|
IDE Support for Java 8
• Generated by -target 1.8 (compiler's default)
• Not accepted by ASM 4.x (Spring's bytecode
parsing library)
• Spring Framework 4.0 comes with patched ASM
4.1 variant
|
Java 1.8 Bytecode Level
• Different hash algorithms in use
• Leading to different hash iteration order
• Code shouldn't rely on such an order but
sometimes does
|
HashMap/HashSet Differences
• Simple rule: interface with single method • typically callback interfaces • for example: Runnable, Callable • formerly “single abstract method” (SAM) types • now “functional interfaces”
|
Java 8 Lambda Conventions
• Many Spring APIs are candidates for lambdas • by naturally following the lambda interface
conventions
|
Lambda + Spring = Natural Fit
• JmsTemplate + MessageCreator: • Message createMessage(Session session) throws
JMSException
|
Lambdas with JMS APIs
• TransactionTemplate + TransactionCallback: • Object doInTransaction(TransactionStatus status)
|
Lambdas with Tx APIs
• JdbcTemplate + RowMapper: • Object mapRow(ResultSet rs, int rowNum) throws
SQLException
|
Lambdas with JDBC APIs
|
Lambdas with JdbcTemplate #1 JdbcTemplate jt = new JdbcTemplate(dataSource);jt.query("SELECT name, age FROM person WHERE dep = ?", ps -> { ps.setString(1, "Sales"); }, (rs, rowNum) -> new Person(rs.getString(1), rs.getInt(2)));
|
Lambdas with JdbcTemplate #2 JdbcTemplate jt = new JdbcTemplate(dataSource);jt.query("SELECT name, age FROM person WHERE dep = ?", ps -> { ps.setString(1, "Sales"); }, (rs, rowNum) -> { return new Person(rs.getString(1), rs.getInt(2)); });
|
Method References (1/2) public List<Person> getPersonList(String department) { JdbcTemplate jt = new JdbcTemplate(this.dataSource); return jt.query( "SELECT name, age FROM person WHERE dep = ?", ps -> { ps.setString(1, "test"); }, this::mapPerson);}
|
Method References (2/2) private Person mapPerson(ResultSet rs, int rowNum) throws SQLException { return new Person(rs.getString(1), rs.getInt(2));}
import java.time.*;import org.springframework.format.annotation.*;public class Customer { // @DateTimeFormat(iso=ISO.DATE) private LocalDate birthDate; @DateTimeFormat(pattern="M/d/yy h:mm") private LocalDateTime lastContact;
|
JSR-310 Date and Time
@Scheduled(cron = "0 0 12 * * ?")@Scheduled(cron = "0 0 18 * * ?")public void performTempFileCleanup() { /* ... */ }@Schedules({ @Scheduled(cron = "0 0 12 * * ?"), @Scheduled(cron = "0 0 18 * * ?")})public void performTempFileCleanup() { /* ... */ }
|
Repeatable Annotations
• Java 8 defines a Parameter reflection type for methods • application sources to be compiled with -parameters
|
Parameter Name Discovery (1/2)
• Spring's StandardReflectionParameterNameDiscoverer • reading parameter names via Java 8's new Parameter type
• Spring's DefaultParameterNameDiscoverer • now checking Java 8 first (-parameters) • ASM-based reading of debug symbols next (-debug)
|
Parameter Name Discovery (2/2)
|
In Closing…
• Spring Framework 4.0 RC1: end of October
• Spring Framework 4.0 RC2: mid November
• Spring Framework 4.0 GA: end of 2013
|
Roadmap
• Spring 3.2 does not support 1.8 bytecode level • upgrade to Spring 4.0 to enable Java 8 language features
• Spring Framework 4.0 still compatible with JDK 6
and 7
• Spring Framework 3.2 is in maintenance mode
|
Upgrade Considerations
Special thanks to Spring Framework project lead
Juergen Hoeller for permitting reuse of his content.
|
Acknowledgements
• Spring Framework
• http://projects.spring.io/spring-framework
• Spring Forums
• http://forum.spring.io
|
Spring Resources (1/2)
• Spring JIRA
• https://jira.springsource.org
• Spring on GitHub
• https://github.com/spring-projects/spring-framework
|
Spring Resources (2/2)
• Swiftmind Blog
• http://www.swiftmind.com/blog
• Spring Blog
• http://spring.io/blog
|
Blogs