2. 22www.springsource.org
Review: Spring 3 Component Model Themes
Powerful annotated component model
• stereotypes, configuration classes, composable annotations
Spring Expression Language
• and its use in value injection
Comprehensive REST support
• and other Spring @MVC additions
Support for async MVC processing
• Spring MVC interacting with Servlet 3.0 async callbacks
Declarative validation and formatting
• integration with JSR-303 Bean Validation
Declarative scheduling
• trigger abstraction, cron support
Declarative caching
4. 44www.springsource.org
A Typical Annotated Component
@Service
public class MyBookAdminService implements BookAdminService {
@Inject
public MyBookAdminService(AccountRepository ar) {
…
}
@Transactional
public BookUpdate updateBook(Addendum addendum) {
…
}
}
5. 55www.springsource.org
Configuration Classes
@Configuration
public class MyBookAdminConfig {
@Bean
public BookAdminService myBookAdminService() {
MyBookAdminService service = new MyBookAdminService();
service.setDataSource(bookAdminDataSource());
return service;
}
@Bean
public DataSource bookAdminDataSource() {
…
}
}
6. 66www.springsource.org
Next Stop: Spring Framework 4.0
First-class support for Java 8 language and API features
• lambda expressions, method references
• JSR-310 Date and Time, etc
A generalized model for conditional bean definitions
• a more flexible and more dynamic variant of bean definition profiles
First-class support for Groovy (in particular: Groovy 2)
• Groovy-based bean definitions (a.k.a. Grails Bean Builder)
• runtime support for regular Spring beans implemented in Groovy
A WebSocket endpoint model along the lines of Spring MVC
• deploying Spring-defined endpoint beans to a WebSocket runtime
7. 77www.springsource.org
Spring 4.0: Upcoming Enterprise Specs
JMS 2.0
• delivery delay, JMS 2.0 createSession variants etc
JTA 1.2
• javax.transaction.Transactional annotation
JPA 2.1
• unsynchronized persistence contexts
Bean Validation 1.1
• method parameter and return value constraints
JSR-236 Concurrency Utilities
• EE-compliant TaskScheduler backend with trigger support
JSR-107 JCache
• standard CacheManager backend, standard caching annotations
8. 88www.springsource.org
Spring and Common Java SE Generations
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
Spring 3.1/3.2: explicit Java 7 support
• JDK 5 – JDK 7
Spring 4.0 introducing explicit Java 8 support now
• JDK 6 – JDK 8
9. 99www.springsource.org
Spring and Common Java EE Generations
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
Spring 3.1/3.2: strong Servlet 3.0 focus
• J2EE 1.4 (deprecated) – Java EE 6
Spring 4.0 introducing explicit Java EE 7 support now
• Java EE 5 (with JPA 2.0 feature pack) – Java EE 7
10. 1010www.springsource.org
The State of Java 8
Delayed again...
• scheduled for GA in September 2013
• now just Developer Preview in September
• OpenJDK 8 GA as late as March 2014 (!)
IDE support for Java 8 language features
• IntelliJ: available since IDEA 12, released in December 2012
• Eclipse: announced for June 2014 (!)
• Spring Tool Suite: trying to get some Eclipse-based support earlier
Spring Framework 4.0 scheduled for GA in October 2013
• with best-effort Java 8 support on OpenJDK 8 Developer Preview
11. 1111www.springsource.org
JDK 8: Initial Problems
1.8 bytecode level
• as generated by -target 1.8 (the compiler's default)
• not accepted by ASM 4.x (Spring's bytecode parsing library)
• Spring Framework 4.0 M1 comes with patched ASM 4.1 variant
HashMap/HashSet implementation differences
• different hash algorithms in use
• leading to different hash iteration order
• code shouldn't rely on such an order but sometimes accidentally does
Note: Java 8 API features can be used with -target 1.7 as well
• compatible with ASM 4.0, as used in Spring Framework 3.2
12. 1212www.springsource.org
JSR-310 Date-Time
Specialized date and time value types in java.time package
• replacing java.util.Date/Calendar, along the lines of the Joda-Time project
• Spring 4.0: annotation-driven date formatting
public class Customer {
// @DateTimeFormat(iso=ISO.DATE)
private LocalDate birthDate;
@DateTimeFormat(pattern="M/d/yy h:mm")
private LocalDateTime lastContact;
}
13. 1313www.springsource.org
Lambda Conventions
Many common Spring APIs are candidates for lambdas
• through naturally following the lambda interface conventions
• formerly "single abstract method" types, now "functional interfaces"
JdbcTemplate
• RowMapper:
Object mapRow(ResultSet rs, int rowNum) throws SQLException
JmsTemplate
• MessageCreator:
Message createMessage(Session session) throws JMSException
TransactionTemplate, TaskExecutor, etc
14. 1414www.springsource.org
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)));
jt.query("SELECT name, age FROM person WHERE dep = ?",
ps -> {
ps.setString(1, "test");
},
(rs, rowNum) -> {
return new Person(rs.getString(1), rs.getInt(2));
});
Java 8 Lambdas with Spring's JdbcTemplate
15. 1515www.springsource.org
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;
}
private Person mapPerson(ResultSet rs, int rowNum)
throws SQLException {
return new Person(rs.getString(1), rs.getInt(2));
}
Java 8 Method References with Spring's JdbcTemplate
16. 1616www.springsource.org
The State of Java 8, Revisited
Current OpenJDK 8 builds work quite well for our purposes
• JSR-310's java.time package is near completion
• lambdas and method references work great
• currently using b88 (due to AspectJ compiler problems with b89+)
IntelliJ IDEA 12 is quite advanced in terms of Java 8 support
• can replace anonymous inner class with lambda if possible
• can auto-complete method reference
• works fine with any recent OpenJDK 8 build
No support for 1.8 bytecode in Gradle's test class detection yet
• Gradle is using an unpatched version of ASM 4.0
17. 1717www.springsource.org
Spring Framework 4.0 M1: May 2013
General pruning and dependency upgrades
• JDK 6+, JPA 2.0+, ASM 4.1, etc
Initial Java 8 support based on OpenJDK 8 M7
• including JSR-310 Date-Time and lambda support
Enterprise specs (EE 7 level)
• JMS 2.0, JTA 1.2, JPA 2.1, Bean Validation 1.1, JSR-236 Concurrency
First prototype of conditional bean definitions
Initial WebSocket endpoint programming model
18. 1818www.springsource.org
Spring Framework 4.0 M2: July 2013
Initial Groovy support story
• Groovy-based bean definitions, some AOP refinements
Up-to-date Java 8 support based on feature-complete OpenJDK 8
• including latest lambda compiler and lambda-based stream APIs
Enterprise specs (EE 7 level)
• support for the final API releases (following the EE 7 release in June)
Second iteration of conditional bean definitions
Annotation-based message endpoint model (-> WebSocket)