Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Jürgen Höller on Spring 4 on Java 8

Jürgen Höller on Spring 4 on Java 8

More Decks by Enterprise Java User Group Austria

Other Decks in Technology

Transcript

  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

    View Slide

  2. 2
    2
    www.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

    View Slide

  3. 3
    3
    www.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

    View Slide

  4. 4
    4
    www.springsource.org
    A Typical Annotated Component
    @Service
    public class MyBookAdminService implements BookAdminService {
    @Inject
    public MyBookAdminService(AccountRepository ar) {

    }
    @Transactional
    public BookUpdate updateBook(Addendum addendum) {

    }
    }

    View Slide

  5. 5
    5
    www.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() {

    }
    }

    View Slide

  6. 6
    6
    www.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

    View Slide

  7. 7
    7
    www.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

    View Slide

  8. 8
    8
    www.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

    View Slide

  9. 9
    9
    www.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

    View Slide

  10. 10
    10
    www.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

    View Slide

  11. 11
    11
    www.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

    View Slide

  12. 12
    12
    www.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;
    }

    View Slide

  13. 13
    13
    www.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

    View Slide

  14. 14
    14
    www.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

    View Slide

  15. 15
    15
    www.springsource.org
    public List 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

    View Slide

  16. 16
    16
    www.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

    View Slide

  17. 17
    17
    www.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

    View Slide

  18. 18
    18
    www.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)

    View Slide

  19. 19
    19
    www.springsource.org
    Q & A

    View Slide