What's New in Spring Framework 5?
Spring 5 is coming and it's packed with new, shiny features. Whether your brain is fully reactive or you love functional programming in Kotlin, you won't be disappointed!
Join the DZone community and get the full member experience.
Join For FreeSpring Framework 5.0 is the first major release of the Spring Framework since version 4 was released in December of 2013. Juergen Hoeller, Spring Framework project lead, announced the release of the first Spring Framework 5.0 milestone (5.0 M1) on July 28, 2016.
Now, almost a year later, we are looking forward to Release Candidate 3 (RC3) to be released on July 18, 2017. This is expected to be the final release on the roadmap to the first GA (General Availability) release of Spring Framework 5.0.
I’m excited about the new features and enhancements in Spring Framework 5.0.
At a high level, features of Spring Framework 5.0 can be categorized into:
- JDK baseline update.
- Core framework revision.
- Core container updates.
- Functional programming with Kotlin.
- Reactive Programming Model.
- Testing improvements.
- Library support.
- Discontinued support.
JDK Baseline Update for Spring Framework 5.0
The entire Spring framework 5.0 codebase runs on Java 8. Therefore, Java 8 is the minimum requirement to work on Spring Framework 5.0.
This is actually very significant for the framework. As developers, we’ve been able to enjoy all the new features found in modern Java releases. The framework itself was carrying a lot of baggage in supporting deprecated Java releases.
Originally, Spring Framework 5.0 was expected to release on Java 9. However, with the Java 9 release running 18+ months behind, the Spring team decided to decouple the Spring Framework 5.0 release from Java 9.
However, when Java 9 is released (expected in September of 2017), Spring Framework 5.0 will be ready.
Core Framework Revision
The core Spring Framework 5.0 has been revised to utilize the new features introduced in Java 8. The key ones are:
- Based on Java 8 reflection enhancements, method parameters in Spring Framework 5.0 can be efficiently accessed.
- Core Spring interfaces now provide selective declarations built on Java 8 default methods.
@Nullable
and@NotNull
annotations will explicitly mark nullable arguments and return values. This enables dealing null values at compile time rather than throwing NullPointerExceptions at runtime.
On the logging front, Spring Framework 5.0 comes out of the box with Commons Logging bridge module, named spring-jcl instead of the standard Commons Logging. Also, this new version will auto detect Log4j 2.x, SLF4J, JUL (java.util.logging) without any extra bridges.
Defensive programming also gets a thrust with the Resource abstraction providing the isFile indicator for the getFile method.
Core Container Updates
Spring Framework 5.0 now supports candidate component index as an alternative to classpath scanning. This support has been added to shortcut the candidate component identification step in the classpath scanner.
An application build task can define its own META-INF/spring.components file for the current project. At compilation time, the source model is introspected and JPA entities and Spring Components are flagged.
Reading entities from the index rather than scanning the classpath does not have significant differences for small projects with less than 200 classes. However, it has significant impacts on large projects. Loading the component index is cheap. Therefore, the startup time with the index remains constant as the number of classes increases.
What this means for us developers is that on large Spring projects, the startup time for our applications will be reduced significantly. While 20 or 30 seconds does not seem like much, when you’re waiting for that amount of time dozens or hundreds of times a day, it adds up. Using the component index will help with your daily productivity.
You can find more information on the component index feature on Spring’s Jira.
Now, @Nullable annotations can also be used as indicators for optional injection points. Using @Nullable imposes an obligation on the consumers that they must prepare for a value to be null. Prior to this release, the only way to accomplish this is through Android’s Nullable, Checker Framework’s Nullable, and JSR 305’s Nullable.
Some other new and enhanced features from the release note are:
- Implementation of functional programming style in
GenericApplicationContext
andAnnotationConfigApplicationContext
. - Consistent detection of transaction, caching, and async annotations on interface methods.
- XML configuration namespaces streamlined towards unversioned schemas.
Functional Programming With Kotlin
Spring Framework 5.0 introduces support for JetBrains Kotlin language. Kotlin is an object-oriented language supporting functional programming style. Kotlin runs on top of the JVM but is not limited to it.
With Kotlin support, developers can dive into functional Spring programming — in particular, for functional Web endpoints and bean registration.
In Spring Framework 5.0, you can write clean and idiomatic Kotlin code for Web functional API like this:
{
("/movie" and accept(TEXT_HTML)).nest {
GET("/", movieHandler::findAllView)
GET("/{card}", movieHandler::findOneView)
}
("/api/movie" and accept(APPLICATION_JSON)).nest {
GET("/", movieApiHandler::findAll)
GET("/{id}", movieApiHandler::findOne)
}
}
For bean registration, as an alternative to XML or @Configuration
and @Bean
, you can now use Kotlin to register your Spring Beans like this:
val context = GenericApplicationContext {
registerBean()
registerBean { Cinema(it.getBean()) }
}
Click here to learn about my new Spring Framework 5 course!
Reactive Programming Model
An exciting feature in this Spring release is the new reactive stack Web framework. Being fully reactive and non-blocking, this stack is suitable for event-loop style processing that can scale with a small number of threads.
Reactive Streams is an API specification developed by engineers from Netflix, Pivotal, Typesafe, Red Hat, Oracle, Twitter, and Spray.io. This provides a common API for reactive programming implementations to implement, much like JPA for Hibernate where JPA is the API and Hibernate is the implementation.
The Reactive Streams API is officially part of Java 9. In Java 8, you will need to include a dependency for the Reactive Streams API specification.
Streaming support in Spring Framework 5.0 is built upon Project Reactor, which implements the Reactive Streams API specification.
Spring Framework 5.0 has a new spring-webflux module that supports reactive HTTP and WebSocket clients. Spring Framework 5.0 also provides support for reactive web applications running on servers which include REST, HTML, and WebSocket-style interactions.
There are two distinct programming models on the server-side in spring-webflux:
- Annotation-based with
@Controller
and the other annotations of Spring MVC. - Functional style routing and handling with Java 8 lambda.
A WebClient implementation of a REST endpoint in Spring 5.0 is as follows:
WebClient webClient = WebClient.create();
Mono person = webClient.get()
.uri("http://localhost:8080/movie/42")
.accept(MediaType.APPLICATION_JSON)
.exchange()
.then(response -> response.bodyToMono(Movie.class));
While the new WebFlux module brings us some exciting new capabilities, traditional Spring MVC is still fully supported in Spring Framework 5.0.
Testing Improvements
Spring Framework 5.0 fully supports JUnit 5 Jupiter to write tests and extensions in JUnit 5. In addition to providing a programming and extension model, the Jupiter sub-project provides a test engine to run Jupiter-based tests on Spring.
In addition, Spring Framework five provides support for parallel test execution in Spring TestContext Framework.
For the reactive programming model, spring-test now includes WebTestClient for integrating testing support for Spring WebFlux. The new WebTestClient, similar to MockMvc does not need a running server. Using a mock request and response, WebTestClient can bind directly to the WebFlux server infrastructure.
For a complete list enhancements in the existing TestContext framework, you can refer here.
Of course, Spring Framework 5.0 still supports our old friend JUnit 4 as well! At the time of writing, JUnit 5 is just about to go GA. Support for JUnit 4 is going to be with the Spring Framework for some time into the future.
Library Support
Spring Framework 5.0 now supports the following upgraded library versions:
- Jackson 2.6+
- EhCache 2.10+ / 3.0 GA
- Hibernate 5.0+
- JDBC 4.0+
- XmlUnit 2.x+
- OkHttp 3.x+
- Netty 4.1+
Discontinued Support
At the API level, Spring Framework 5.0 has discontinued support for the following packages:
beans.factory.access
jdbc.support.nativejdbc
mock.staticmock
of the spring-aspects module.web.view.tiles2M
. Now Tiles 3 is the minimum requirement.orm.hibernate3
andorm.hibernate4
. Now, Hibernate 5 is the supported framework
Spring Framework 5.0 has also discontinued support for the following libraries:
- Portlet.
- Velocity.
- JasperReports.
- XMLBeans.
- JDO.
- Guava.
If you are using any of the preceding packages, it is recommended to stay on Spring Framework 4.3.x.
Summary
The highlight of the Spring Framework 5.0 is definitely reactive programming, which is a significant paradigm shift. You can look at Spring Framework 5.0 as a cornerstone release for reactive programs. For the remainder of 2017 and beyond, you can expect to see child projects implement reactive features. You will see reactive programming features added to upcoming releases of Spring Data, Spring Security, Spring Integration, and more.
The Spring Data team has already implemented reactive support for MongoDB and Redis.
It’s still too early to get reactive support with JDBC. The JDBC specification itself is blocking. So, it's going to be some time before we see reactive programming with traditional JDBC databases.
Published at DZone with permission of John Thompson, DZone MVB. See the original article here.
Opinions expressed by DZone contributors are their own.
Comments