Spring 4 on Java 8 by Juergen Hoeller

12,235 views

Published on

Published in: Technology, Education

Spring 4 on Java 8 by Juergen Hoeller

  1. 1. © 2012 SpringSource, A division of VMware. All rights reserved www.springsource.org Spring 4 on Java 8 – A Work in Progress Jürgen Höller, Pivotal
  2. 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
  3. 3. 33www.springsource.org Review: Spring 3 - Key Specifications  JSR-330 (Dependency Injection for Java) • @Inject, @Qualifier, Provider mechanism  JSR-303 (Bean Validation 1.0) • declarative constraints, embedded validation engine  JPA 2.0 • persistence provider integration, Spring transactions  Servlet 3.0 • web.xml-free deployment, async request processing
  4. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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)
  19. 19. 1919www.springsource.org Q & A

×