¿Qué hay de nuevo en Spring Boot 2.2?

La traducción del artículo fue preparada específicamente para los estudiantes del curso "Desarrollador en el Marco de Primavera" .




¡El 16 de octubre de 2019, se lanzó Spring Boot 2.2!

En esta publicación aprenderá sobre las muchas novedades que le ofrece la versión 2.2.

Maven


Para comenzar con Spring Boot 2.2. En su aplicación, actualice a la nueva versión de 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> 


Si está iniciando la aplicación desde cero, cree un proyecto Maven o Grade en start.spring.io !



Inicialización global de frijol perezoso


La inicialización diferida de los componentes de bean ha sido admitida durante mucho tiempo en Spring Framework.

El bean vagamente inicializado le dice al contenedor de IoC que cree una instancia del bean en la primera solicitud, y no en el inicio.


La nueva característica introducida en Spring Boot 2.2 es compatible con la inicialización global diferida de componentes de bean (esta característica está deshabilitada de manera predeterminada).

¿Qué sucede cuando activas la inicialización global de lazy bean?

  • La inicialización de todos los beans de Spring y sus dependencias se retrasará hasta que se necesiten.


Para reducir el tiempo de inicio de la aplicación, ahora puede habilitar la inicialización diferida global de Spring Beans en las propiedades de configuración mediante:

 spring.main.lazy.initialization=true 


o para la configuración yml:

 spring: main: lazy-initialization: true 


¿Hay alguna desventaja al usar la inicialización de frijol perezoso? Por supuesto! Es muy importante comprender las consecuencias: ¡no debe incluir la inicialización global de componentes de bean sin pensar en esta solución! Hay algunas compensaciones a considerar:

  • El procesamiento de solicitudes HTTP puede llevar más tiempo mientras se produce cualquier inicialización diferida. Las solicitudes posteriores no se ven afectadas.
  • Las fallas que generalmente ocurren al inicio (dado que los beans Spring y sus dependencias se crean al crear el contexto de la aplicación) ahora no ocurrirán de inmediato. Por lo tanto, su aplicación ya no producirá fallas obvias al inicio. Como resultado: su cliente puede ser el primero en encontrar un problema (cableado de bean).


Si no desea habilitar la inicialización diferida del bean ( spring.main.lazy.initialization = false ) globalmente, puede considerar configurar la inicialización diferida para un componente específico utilizando la anotación @Lazy .

Por otro lado, también es posible habilitar la inicialización diferida de componentes de bean ( spring.main.lazy.initialization = true ) a nivel global e inhabilitar explícitamente la inicialización diferida para un componente en particular.

Resumir





JMX está deshabilitado por defecto


A partir de Spring Boot 2.2, JMX está deshabilitado de forma predeterminada. Esto ayuda a reducir el tiempo de inicio de la aplicación y no desperdicia una cantidad significativa de recursos en tiempo de ejecución. Si aún depende de JMX, puede habilitarlo nuevamente:

 spring.jmx.enabled=true 


o:

 spring: jmx: enabled: true 


Mejoras para las propiedades de configuración


Spring Boot 2.2 viene con algunas buenas mejoras para las propiedades de configuración.

  • Compatibilidad de escaneo de @ConfigurationProperties para @ConfigurationProperties
  • @ConfigurationProperties inmutable @ConfigurationProperties


Compatibilidad de escaneo de @ConfigurationProperties para @ConfigurationProperties


Spring Boot creará un bean para cada clase de configuración anotada con @ConfigurationProperties encuentra al escanear el classpath . Esta es una alternativa al uso

  • @EnableConfigurationProperties para una clase que une una clase de propiedad
  • o usando la anotación @Component en la clase de configuración para convertirla en un bean.


Tenga en cuenta que se pueden crear dos componentes de bean para la clase de configuración, anotados con @Component y @ConfigurationProperties . ¡En tales casos, @Component debe eliminarse de su clase de configuración!

@ConfigurationProperties inmutable @ConfigurationProperties


El uso del enlace de propiedades basado en constructor ahora admite clases de propiedades de configuración inmutables. Los @ConfigurationProperties basados ​​en constructores se pueden habilitar anotando la clase @ConfigurationProperties o uno de sus constructores con @ConstructorBinding .

Por ejemplo:

 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, } } 


propiedades en mi application.yml:

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


Consulte la documentación para más detalles.

Cambios de punto final del actuador


El punto final /actuator/health cambió el formato JSON resultante al renombrar details a components para components de primer nivel.

El tipo de medio del actuador se cambió de: application/vnd.spring-boot.actuator.v2+json a application/vnd.spring-boot.actuator.v3+json .

Ejemplo de respuesta de punto final /actuator/health antes de Spring Boot 2.2 (Actuador 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" } } } 


Respuesta de punto final /actuator/health Spring Boot 2.2 (Actuador 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" } } } 


Su kit de herramientas puede depender del formato del actuador de salud V2.

El estado de Spring Boot 2.2 es compatible con versiones anteriores al especificar el encabezado HTTP Accept : con el tipo de medio V2, application/vnd.spring-boot.actuator.v2+json

Puedes hacerlo tú mismo usando curl:

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

Junto con este cambio, ahora también es posible organizar los indicadores de desempeño en grupos .

Soporte RSocket


RSocket es un protocolo de comunicación binario utilizado para transportar flujos de bytes. Posibilita modelos de interacción simétrica a través de mensajes asíncronos a través de un solo canal.

Junto con el nuevo iniciador para RSocket, se agregó una amplia configuración automática.

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


Para obtener más información, lea la documentación de RSocket Spring Boot .

Soporte de Java 13


Java 13 fue lanzado el 17 de septiembre de 2019.

Spring Framework 5.2 y Spring Boot 2.2 ahora son compatibles con Java 13.

Las versiones Java LTS 8 y 11 seguirán siendo compatibles con Spring Boot 2.2.

Kubernetes Cloud Platform Discovery


ConditionalOnCloudPlatform ahora determina si su aplicación Spring Boot se está ejecutando en 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 { } 


Pancartas


Spring Boot viene con un banner predeterminado que aparece en la consola inmediatamente después de que se inicia la aplicación.



Esta es una característica bastante geek, pero Spring Boot ya admite banners personalizados (animados).

Comenzando con Spring Boot 2.2, puede hacer que su banner sea aún más agradable:

  • Los archivos de banner ASCII ahora pueden usar caracteres de control de color ANSI 256 usando {AnsiColor.NNN} (donde NNN es el código de color ).
  • Ahora para banners gráficos (animados), puede establecer la propiedad spring.banner.image.bitdepth en 8 . Y la propiedad spring.banner.image.pixelmode en block para usar caracteres ASCII de bloque.


El resultado se parece a esto:



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

Para ver un ejemplo simple de un banner Spring Boot 2.2 animado mejorado, vea mi ejemplo de Github .

Migración de Java EE a Jakarta EE


Donde sea posible, el comando Spring (Boot) cambió de las dependencias Java EE con un identificador de grupo de javax . Dependencias equivalentes de Yakarta EE con ID de grupo de Yakarta en arrancadores Spring Boot.

Además, se agregó la gestión de dependencias para la API de dependencia de Jakarta EE junto con la gestión de dependencias existente para la API de dependencia de Java EE.

Tenga en cuenta que la administración de dependencias de la API Java EE se eliminará en futuras versiones de Spring Boot, y se recomienda que comience a usar las dependencias de la API Jakarta EE.

Cambios clave de configuración


Spring Boot 2.2 presenta muchas nuevas claves de configuración. También hay claves que están desactualizadas y eliminadas. Hay demasiados cambios para cubrirlos todos, pero aquí hay algunos importantes:

logging.file cambiado de nombre a logging.file.name
logging.path cambiado de nombre a logging.file.path

Para obtener una descripción completa de todos los cambios, consulte el registro de cambios de configuración de Spring Boot 2.2.

Anticuado


Consulte las notas de la versión para obtener una lista completa de las clases y propiedades en desuso .

Algunos cambios que deben tenerse en cuenta:

  • Soporte de tiempo de Joda en desuso a favor de java.time
  • El cliente de transporte Elasticsearch y el cliente Jest están en desuso en favor de otras opciones como RestHighLevelClient y ReactiveElasticsearchClient; consulte la documentación para obtener más detalles.


Actualizaciones de dependencia


Spring Boot 2.2 viene con muchas dependencias actualizadas.

Actualizaciones de dependencia de primavera:



Las actualizaciones más importantes para otras dependencias:



Probar actualización de dependencia:



Actualización a Spring Boot 2.2


Desde el 1 de agosto de 2019, Spring Boot 1.x ha completado su ciclo de vida . Si aún usa las aplicaciones Spring Boot 1.x, ¡es hora de actualizar!

Recuerde que las clases, métodos y propiedades que están en desuso en Spring Boot 2.1 se han eliminado en Spring Boot 2.2. Asegúrese de no llamar a métodos obsoletos antes de actualizar. Consulte las notas de la versión en desuso en Spring Boot 2.1.

Puede encontrar más información en los siguientes enlaces:



Haga clic en + si este artículo le resultó útil.

¿Alguna pregunta o comentario?
Buscar en Twitter: @TimvanBaarsen

Source: https://habr.com/ru/post/475384/


All Articles