What's new in spring boot 2.2?

The translation of the article was prepared specifically for students of the course "Developer on the Spring Framework" .








On October 16, 2019, Spring Boot 2.2 was released!



In this post you will learn about the many new goodies that version 2.2 offers you.



Maven



To get started with Spring Boot 2.2. In your application, upgrade to the new version of starter-parent .



<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.2.0.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.example</groupId> <artifactId>your-very-cool-project</artifactId> <version>0.0.1-SNAPSHOT</version> <name>your-very-cool-project</name> <description>Spring Boot 2.2 Project</description> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> <exclusions> <exclusion> <groupId>org.junit.vintage</groupId> <artifactId>junit-vintage-engine</artifactId> </exclusion> </exclusions> </dependency> </dependencies> </project>
      
      







If you are starting the application from scratch, create a Maven or Grade project at start.spring.io !







Global lazy bean initialization



Lazy initialization of bean components has long been supported in the Spring Framework.



The lazily initialized bean tells the IoC container to instantiate the bean at the first request, and not at startup.




The new feature introduced in Spring Boot 2.2 is support for the global lazy initialization of bean components (this feature is disabled by default).



What happens when you turn on global lazy bean initialization?







To reduce application startup time, you can now enable the global lazy initialization of Spring beans in the configuration properties using:



 spring.main.lazy.initialization=true
      
      







or for yml configuration:



 spring: main: lazy-initialization: true
      
      







Are there any disadvantages to using lazy bean initialization? Of course! It is very important to understand the consequences - you should not include the global initialization of bean components without thinking about this solution! There are some tradeoffs to consider:







If you do not want to enable lazy initialization of the bean ( spring.main.lazy.initialization = false



) globally, you can consider setting up lazy initialization for a particular component using the @Lazy



annotation.



On the other hand, it is also possible to enable lazy initialization of bean components ( spring.main.lazy.initialization = true



) at the global level and explicitly disable lazy initialization for a particular component.



Summarize:











JMX is disabled by default



Starting with Spring Boot 2.2, JMX is disabled by default. This helps reduce application startup time and not waste a significant amount of resources at runtime. If you are still dependent on JMX, you can enable it again:



 spring.jmx.enabled=true
      
      







or:



 spring: jmx: enabled: true
      
      







Improvements for configuration properties



Spring Boot 2.2 comes with some nice improvements for configuration properties.







Classpath scan support for @ConfigurationProperties





Spring Boot will create a bean for each configuration class annotated with @ConfigurationProperties



found when scanning the classpath . This is an alternative to using







Keep in mind that two bean components can be created for the configuration class, annotated with both @Component



and @ConfigurationProperties



. In such cases, @Component



should be removed from your configuration class!



Immutable binding @ConfigurationProperties





Using constructor-based properties binding now supports immutable configuration property classes. Constructor-based @ConfigurationProperties



can be enabled by annotating the @ConfigurationProperties



class or one of its constructors with @ConstructorBinding



.



For example:



 package com.example.immutable.configuration.binding; import lombok.Getter; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.context.properties.ConstructorBinding; @Getter @ConfigurationProperties("stock.quote.subscription") public class ImmutableStockQuoteSubscriptionProperties { private final String endpoint; private final String apiKey; private final SubscriptionType subscriptionType; private final boolean enabled; @ConstructorBinding public ImmutableStockQuoteSubscriptionProperties(String endpoint, String apiKey, SubscriptionType subscriptionType, boolean enabled) { this.endpoint = endpoint; this.apiKey = apiKey; this.subscriptionType = subscriptionType; this.enabled = enabled; } enum SubscriptionType { /** * Real time stock quotes */ REALTIME, /** * Stock quotes that are delayed by 15 minutes */ DELAYED, } }
      
      







properties in my application.yml:



 stock: quote: subscription: endpoint: http://stockgeeks.io/api enabled: true apiKey: secret subscriptionType: realtime
      
      







See the documentation for more details.



Actuator Endpoint Changes



The /actuator/health



endpoint changed the resulting JSON format by renaming details



to components



for first-level elements.



The actuator media type has been changed from: application/vnd.spring-boot.actuator.v2+json



to application/vnd.spring-boot.actuator.v3+json



.



Example endpoint response /actuator/health



before Spring Boot 2.2 (Actuator V2):



 { "status": "UP", "details": { "db": { "status": "UP", "details": { "database": "HSQL Database Engine", "result": 1, "validationQuery": "SELECT COUNT(*) FROM INFORMATION_SCHEMA.SYSTEM_USERS" } }, "diskSpace": { "status": "UP", "details": { "total": 250685575168, "free": 32597131264, "threshold": 10485760 } }, "ping": { "status": "UP" } } }
      
      







Endpoint answer /actuator/health



Spring Boot 2.2 (Actuator V3):



 { "status": "UP", "components": { "db": { "status": "UP", "details": { "database": "HSQL Database Engine", "result": 1, "validationQuery": "SELECT COUNT(*) FROM INFORMATION_SCHEMA.SYSTEM_USERS" } }, "diskSpace": { "status": "UP", "details": { "total": 250685575168, "free": 32605003776, "threshold": 10485760 } }, "ping": { "status": "UP" } } }
      
      







Your toolkit may depend on the health actuator V2 format.



Spring Boot 2.2 health is backward compatible with specifying the Accept



HTTP header: with V2 media type, application/vnd.spring-boot.actuator.v2+json







You can do it yourself using curl:



curl -H "Accept: application/vnd.spring-boot.actuator.v2+json" http://localhost:8080/actuator/health







Along with this change, it is now also possible to organize performance indicators into groups .



RSocket Support



RSocket is a binary communication protocol used to transport byte streams. It enables symmetric interaction models through asynchronous messaging over a single channel.



Along with a new starter for RSocket, an extensive auto-configuration was added.



 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-rsocket</artifactId> </dependency>
      
      







For more information, read the RSocket Spring Boot documentation.



Java 13 support



Java 13 was released on September 17, 2019.



Spring Framework 5.2 and Spring Boot 2.2 now support Java 13.



Java LTS versions 8 and 11 will remain compatible with Spring Boot 2.2.



Kubernetes Cloud Platform Discovery



ConditionalOnCloudPlatform



now determines whether your Spring Boot application is running in Kubernetes.



 package nl.jtim.spring.boot; import org.springframework.boot.autoconfigure.condition.ConditionalOnCloudPlatform; import org.springframework.boot.cloud.CloudPlatform; import org.springframework.stereotype.Service; @Service @ConditionalOnCloudPlatform(CloudPlatform.KUBERNETES) public class MyVeryCoolService { }
      
      







Banners



Spring Boot comes with a default banner, which is displayed in the console immediately after the application starts.







This is a pretty geeky feature, but Spring Boot already supports (animated) custom banners.



Starting with Spring Boot 2.2, you can make your banner even nicer:







The result looks something like this:







Source: https://github.com/spring-projects/spring-boot/wiki/images/animated-ascii-art-256.gif



For a simple example of an improved animated Spring Boot 2.2 banner, see my Github example .



Migrating from Java EE to Jakarta EE



Where possible, the Spring (Boot) command switched from Java EE dependencies with a group identifier of javax



. Jakarta EE equivalent dependencies with group ID jakarta



. in Spring Boot starters.



In addition, dependency management for the Jakarta EE dependency API was added along with the existing dependency management for the Java EE dependency API.



Keep in mind that Java EE API dependency management will be removed in future versions of Spring Boot, and it is recommended that you start using the Jakarta EE API dependencies.



Configuration Key Changes



Spring Boot 2.2 introduces many new configuration keys. There are also keys that are outdated and deleted. There are too many changes to cover all of them, but here are some important ones:



logging.file



been renamed to logging.file.name





logging.path



been renamed to logging.file.path







For a complete overview of all changes, see the Spring Boot 2.2 configuration change log!



Outdated



Check out the release notes for a complete list of deprecated classes and properties .



Some changes that should be noted:







Dependency Updates



Spring Boot 2.2 comes with many updated dependencies.



Spring Dependency Updates:







The most important updates to other dependencies:







Test dependency update:







Upgrading to Spring Boot 2.2



Since August 1, 2019, Spring Boot 1.x has completed its life cycle . If you are still using Spring Boot 1.x applications, it's time to upgrade!



Remember that classes, methods, and properties that are deprecated in Spring Boot 2.1 have been removed in Spring Boot 2.2. Make sure you don't call deprecated methods before upgrading. Check out the release notes for deprecated in Spring Boot 2.1.



You can find more information at the following links:







Click + if you found this article helpful!



Have questions or feedback?

Search Twitter: @TimvanBaarsen






All Articles