What’s new in Spring Framework 5?
21 CommentsLast Updated on May 23, 2019 by Simanta
Spring 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 28 July 2016.
Now, a year later, we are looking forward to Release Candidate 3 (RC3) to be released on July 18th, 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. While 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.
The framework now requires a minimum of Java 8.
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 to explicitly mark nullable arguments and return values. This enables dealing null values at compile time rather than throwingNullPointerExceptions
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 increase. While for a compoent scan the startup time increases significantly.
What this means for us developers 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 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, 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 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()) } }
Reactive Programming Model
An exciting feature in this Spring release is the new reactive stack Web framework.
Being fully reactive and non-blocking, this Spring Framework 5.0 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 includes REST, HTML, and WebSocket style interactions.
I have a detailed post about Reactive Streams here.
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
With Spring Webflux, you can now create WebClient
, which is reactive and non-blocking as an alternative to RestTemplate
.
A WebClient
implementation of a REST endpoint in Spring 5.0 is this.
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 5 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 thespring-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, its going to be some time before we see reactive programming with traditional JDBC databases.
While Reactive Programming is the shiny new toy inside of Spring Framework 5.0, it’s not going to be supported everywhere. The downstream technologies need to provide reactive support.
With the growing popularity of Reactive Programming, we can expect to see more and more technologies to implement Reactive solutions. The reactive landscape is rapidly evolving. Spring Framework 5 uses Reactor, which is Reactive Streams compliant implementation. You can read more about the Reactive Streams specification here.
covenant chukwudi
Wow wonderful, The Spring team never ceases to amaze me.
Rob
What’s an alternative to JasperReports for Spring 5? I am using Jasper in Spring 4.x projects, and I want to be prepared for the change.
jt
I don’t know.
Simanta Sarma
You can try out DynamicReports or DynamicJasper – both JasperReports wrappers that hides the complexity of JasperReports. You will save time.
But this has nothing to do with moving from Spring 4 to Spring 5.
HP
Why spring 5.0 discontinue “Portlet” ?
jt
I don’t think it used very much any more.
Jay
what are the performance improvements area for using Reactive v/s using blocking asynch calls ? What is the best way to measure this for a Mono kind of object ?
sanjay
suuper…
Narendra Allu
Nice explanation.
Found some repetitive text in the document like
“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.
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.”
jt
Thanks – I was using Gramerly – which is cool, but buggy.
Jairo Alberto Morales De la Torre
Dear, How do I integreate jasper reports with spring security?
Ravi Bevara
make it clear picture of spring versions ,I want to know the how version by version differs.
ram
How i can use parseStringValue() method
Mohit Gupta
What is meant by spring deprecated the support for XMLBeans ? does that mean I can’t use spring bean definition in .xml file in my project anymore?