Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!
Перевод статьи подготовлен специально для студентов курса «Разработчик на Spring Framework».
16 октября 2019 года был выпущен Spring Boot 2.2 !
В этом посте вы узнаете о многих новых плюшках, которые предлагает вам версия 2.2.
Для начала работы со Spring Boot 2.2. в вашем приложении обновитесь до новой версии starter-parent.
Если же вы запускаете приложение с нуля, создайте проект Maven или Grade на start.spring.io!
Ленивая инициализация bean-компонентов давно поддерживается в Spring Framework.
Новая функция, представленная в Spring Boot 2.2, — это поддержка глобальной ленивой инициализации bean-компонентов (по умолчанию эта функция отключена).
Что происходит, когда вы включаете глобальную ленивую инициализацию bean-компонентов?
Чтобы сократить время запуска приложения, вы теперь можете включить глобальную ленивую инициализацию bean-компонентов Spring в свойствах конфигурации, используя:
или для yml-конфигурации:
Есть ли недостатки в использовании ленивой инициализации bean-компонентов? Конечно! Очень важно понимать последствия — вы не должны включать глобальную инициализацию bean-компонентов, не обдумав это решение! Есть некоторые компромиссы для рассмотрения:
Если вы не хотите включать ленивую инициализацию bean-компонента (
С другой стороны, также возможно включить ленивую инициализацию bean-компонентов (
Обобщим:
Начиная со Spring Boot 2.2, JMX по умолчанию отключен. Это помогает сократить время запуска приложения и не тратить впустую значительное количество ресурсов во время выполнения. Если вы все-таки зависите от JMX, вы можете включить его снова:
или:
Spring Boot 2.2 поставляется с некоторыми приятными улучшениями для свойств конфигурации.
Поддержка сканирования сlasspath для
Spring Boot создаст bean-компонент для каждого класса конфигурации, аннотированного
Имейте в виду, что для класса конфигурации могут быть созданы два bean-компонента, аннотированных как
Неизменное связывание (immutable binding
С помощью связывания свойств на основе конструктора (constructor-based properties binding) теперь поддерживаются неизменные (immutable) классы свойств конфигурации. Связывание на основе конструктора можно включить, аннотировав класс
Например:
свойства в моем application.yml:
Для более подробной информации ознакомьтесь с документацией.
Конечная точка
Тип носителя actuator был изменен с:
Пример ответа конечной точки
Ответ конечной точки
Ваш инструментарий может зависеть от формата health actuator V2.
Spring Boot 2.2 health обратно совместима с указанием заголовка HTTP
Вы можете сделать это самостоятельно, используя curl:
Наряду с этим изменением, теперь также возможно организовывать показатели работоспособности в группы.
RSocket — это двоичный протокол связи, используемый для транспортировки байтовых потоков. Он делает возможными симметричные модели взаимодействия через асинхронную передачу сообщений по одному каналу.
Вместе с новым стартером для RSocket была добавлена обширная авто-конфигурация.
Для получения более подробной информации читайте документацию RSocket Spring Boot.
Java 13 была выпущена 17 сентября 2019 года.
Spring Framework 5.2 и Spring Boot 2.2 теперь поддерживают Java 13.
LTS Java версий 8 и 11 останутся совместимыми с Spring Boot 2.2.
Spring Boot поставляется с баннером по умолчанию, который отображается в консоли сразу после запуска приложения.
Это достаточно гиковская фича, но Spring Boot уже поддерживает (анимированные) пользовательские баннеры.
Начиная с Spring Boot 2.2 вы можете сделать свой баннер еще приятнее:
Результат выглядит примерно так:
Источник: https://github.com/spring-projects/spring-boot/wiki/images/animated-ascii-art-256.gif
Для простого примера улучшенного анимированного Spring Boot 2.2 баннера смотрите мой пример на Github.
Где это было возможно, команда Spring (Boot) перешла от Java EE зависимостей с групповым идентификатором
Кроме того, было добавлено управление зависимостями для Jakarta EE API зависимостей наряду с существующим управлением зависимостями для Java EE API зависимостей.
Имейте в виду, что управление Java EE API зависимостями будет удалено в будущих версиях Spring Boot, и рекомендуется начинать использовать Jakarta EE API зависимости.
Spring Boot 2.2 представляет много новых ключей конфигурации. Есть также ключи, которые устарели и удалены. Изменений слишком много, чтобы охватить их все, но вот некоторые важные:
Для полного обзора всех изменений смотрите лог изменений конфигурации Spring Boot 2.2!
Ознакомьтесь с примечаниями к выпуску для получения полного списка устаревших классов и свойств.
Некоторые изменения, которые следует отметить:
Spring Boot 2.2 поставляется с множеством обновленных зависимостей.
Обновления зависимостей Spring:
Наиболее важные обновления других зависимостей:
Обновление тестовых зависимостей:
С 1 августа 2019 года Spring Boot 1.x закончил жизненный цикл. Если вы все еще используете приложения Spring Boot 1.x, пришло время обновиться!
Помните, что классы, методы и свойства, которые устарели в Spring Boot 2.1, были удалены в Spring Boot 2.2. Убедитесь, что вы не вызываете устаревшие методы перед обновлением. Проверьте примечания к выпуску для устаревшего в Spring Boot 2.1.
Больше информации вы сможете найти по следующим ссылкам:
Жмите +, если вы нашли эту статью полезной!
Есть вопросы или отзывы?
Ищите Twitter:
16 октября 2019 года был выпущен Spring Boot 2.2 !
В этом посте вы узнаете о многих новых плюшках, которые предлагает вам версия 2.2.
Maven
Для начала работы со Spring Boot 2.2. в вашем приложении обновитесь до новой версии 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>
Если же вы запускаете приложение с нуля, создайте проект Maven или Grade на start.spring.io!
Глобальная ленивая инициализация bean
Ленивая инициализация bean-компонентов давно поддерживается в Spring Framework.
Лениво инициализируемый bean-компонент говорит контейнеру IoC создавать экземпляр bean-компонента при первом запросе, а не при запуске.
Новая функция, представленная в Spring Boot 2.2, — это поддержка глобальной ленивой инициализации bean-компонентов (по умолчанию эта функция отключена).
Что происходит, когда вы включаете глобальную ленивую инициализацию bean-компонентов?
- Инициализация всех bean-компонентов Spring и их зависимостей будет отложена до тех пор, пока они не потребуются.
Чтобы сократить время запуска приложения, вы теперь можете включить глобальную ленивую инициализацию bean-компонентов Spring в свойствах конфигурации, используя:
spring.main.lazy.initialization=true
или для yml-конфигурации:
spring:
main:
lazy-initialization: true
Есть ли недостатки в использовании ленивой инициализации bean-компонентов? Конечно! Очень важно понимать последствия — вы не должны включать глобальную инициализацию bean-компонентов, не обдумав это решение! Есть некоторые компромиссы для рассмотрения:
- Обработка HTTP-запросов может занять больше времени, пока происходит любая ленивая инициализация. Последующие запросы не затрагиваются.
- Сбои, которые обычно возникают при запуске (поскольку бины Spring и их зависимости создаются при создании контекста приложения), теперь будут возникать не сразу. Таким образом, ваше приложение больше не будет выдавать очевидные сбои при запуске! Как следствие: ваш клиент может быть первым, кто столкнется с проблемой (bean wiring).
Если вы не хотите включать ленивую инициализацию bean-компонента (
spring.main.lazy.initialization = false
) на глобальном уровне, вы можете рассмотреть возможность настройки ленивой инициализации для конкретного компонента с помощью аннотации @Lazy
.С другой стороны, также возможно включить ленивую инициализацию bean-компонентов (
spring.main.lazy.initialization = true
) на глобальном уровне и явно отключить ленивую инициализацию для конкретного компонента.Обобщим:
JMX отключен по умолчанию
Начиная со Spring Boot 2.2, JMX по умолчанию отключен. Это помогает сократить время запуска приложения и не тратить впустую значительное количество ресурсов во время выполнения. Если вы все-таки зависите от JMX, вы можете включить его снова:
spring.jmx.enabled=true
или:
spring:
jmx:
enabled: true
Улучшения для свойств конфигурации
Spring Boot 2.2 поставляется с некоторыми приятными улучшениями для свойств конфигурации.
- Поддержка сканирования classpath для
@ConfigurationProperties
- Неизменное связывание (immutable binding)
@ConfigurationProperties
Поддержка сканирования сlasspath для @ConfigurationProperties
Spring Boot создаст bean-компонент для каждого класса конфигурации, аннотированного
@ConfigurationProperties
, найденного при сканировании сlasspath. Это альтернатива использованию- @EnableConfigurationProperties для класса, связывающего класс свойств
- или использованию аннотации
@Component
в классе конфигурации, чтобы сделать его бином.
Имейте в виду, что для класса конфигурации могут быть созданы два bean-компонента, аннотированных как
@Component
, так и @ConfigurationProperties
. В таких случаях @Component
должен быть удален из вашего класса конфигурации!Неизменное связывание (immutable binding @ConfigurationProperties
С помощью связывания свойств на основе конструктора (constructor-based properties binding) теперь поддерживаются неизменные (immutable) классы свойств конфигурации. Связывание на основе конструктора можно включить, аннотировав класс
@ConfigurationProperties
или один из его конструкторов с помощью @ConstructorBinding
.Например:
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,
}
}
свойства в моем application.yml:
stock:
quote:
subscription:
endpoint: http://stockgeeks.io/api
enabled: true
apiKey: secret
subscriptionType: realtime
Для более подробной информации ознакомьтесь с документацией.
Изменения конечных точек Actuator
Конечная точка
/actuator/health
изменила результирующий JSON-формат, переименовав details
в components
для элементов первого уровня.Тип носителя actuator был изменен с:
application/vnd.spring-boot.actuator.v2+json
на application/vnd.spring-boot.actuator.v3+json
.Пример ответа конечной точки
/actuator/health
до 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"
}
}
}
Ответ конечной точки
/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"
}
}
}
Ваш инструментарий может зависеть от формата health actuator V2.
Spring Boot 2.2 health обратно совместима с указанием заголовка HTTP
Accept
: с типом носителя V2, application/vnd.spring-boot.actuator.v2+json
Вы можете сделать это самостоятельно, используя curl:
curl -H "Accept: application/vnd.spring-boot.actuator.v2+json" http://localhost:8080/actuator/health
Наряду с этим изменением, теперь также возможно организовывать показатели работоспособности в группы.
Поддержка RSocket
RSocket — это двоичный протокол связи, используемый для транспортировки байтовых потоков. Он делает возможными симметричные модели взаимодействия через асинхронную передачу сообщений по одному каналу.
Вместе с новым стартером для RSocket была добавлена обширная авто-конфигурация.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-rsocket</artifactId>
</dependency>
Для получения более подробной информации читайте документацию RSocket Spring Boot.
Поддержка Java 13
Java 13 была выпущена 17 сентября 2019 года.
Spring Framework 5.2 и Spring Boot 2.2 теперь поддерживают Java 13.
LTS Java версий 8 и 11 останутся совместимыми с Spring Boot 2.2.
Обнаружение облачной платформы Kubernetes
ConditionalOnCloudPlatform
теперь определяет, запущено ли ваше Spring Boot приложение в 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 {
}
Баннеры
Spring Boot поставляется с баннером по умолчанию, который отображается в консоли сразу после запуска приложения.
Это достаточно гиковская фича, но Spring Boot уже поддерживает (анимированные) пользовательские баннеры.
Начиная с Spring Boot 2.2 вы можете сделать свой баннер еще приятнее:
- Файлы баннеров ASCII теперь могут использовать управляющие символы цвета ANSI 256 с помощью {AnsiColor.NNN} (где NNN — это код цвета).
- Теперь для (анимированных) графических баннеров вы можете установить свойство
spring.banner.image.bitdepth
равным8
. И свойствоspring.banner.image.pixelmode
вblock
для использования блочных символов ASCII.
Результат выглядит примерно так:
Источник: https://github.com/spring-projects/spring-boot/wiki/images/animated-ascii-art-256.gif
Для простого примера улучшенного анимированного Spring Boot 2.2 баннера смотрите мой пример на Github.
Миграция с Java EE к Jakarta EE
Где это было возможно, команда Spring (Boot) перешла от Java EE зависимостей с групповым идентификатором
javax
. к эквивалентным Jakarta EE зависимостям с групповым идентификатором jakarta
.в стартерах Spring Boot.Кроме того, было добавлено управление зависимостями для Jakarta EE API зависимостей наряду с существующим управлением зависимостями для Java EE API зависимостей.
Имейте в виду, что управление Java EE API зависимостями будет удалено в будущих версиях Spring Boot, и рекомендуется начинать использовать Jakarta EE API зависимости.
Изменения ключей конфигурации
Spring Boot 2.2 представляет много новых ключей конфигурации. Есть также ключи, которые устарели и удалены. Изменений слишком много, чтобы охватить их все, но вот некоторые важные:
logging.file
был переименован в logging.file.name
logging.path
был переименован в logging.file.path
Для полного обзора всех изменений смотрите лог изменений конфигурации Spring Boot 2.2!
Устаревшее
Ознакомьтесь с примечаниями к выпуску для получения полного списка устаревших классов и свойств.
Некоторые изменения, которые следует отметить:
- Поддержка времени Joda устарела в пользу
java.time
- Elasticsearch transport client и Jest client устарели в пользу других опций, таких как RestHighLevelClient и ReactiveElasticsearchClient, см. документацию для получения более подробной информации.
Обновления зависимостей
Spring Boot 2.2 поставляется с множеством обновленных зависимостей.
Обновления зависимостей Spring:
- Spring Framework 5.2.0
- Spring AMQP 2.2.0
- Spring Batch 4.2.0
- Spring Data Moore RELEASE
- Spring HATEOAS 1.0.0
- Spring Integration 5.2.0
- Spring Kafka 2.3.0
- Spring Security 5.2.0
- Spring Session Corn
Наиболее важные обновления других зависимостей:
- Elasticsearch 6.8.3 (ознакомьтесь с ключевыми изменениями: в 6.5, 6.6 и 6.7)
- Flyway 6.0.6
- HSQLDB 2.5.0
- Jackson 2.10.0
- Jersey 2.29.1
- Kafka 2.3.0
- Kotlin 1.3.50
- Lombok 1.18.10
- Micrometer 1.3
- Netty 4.1.42
- Reactor Dysprosium
- Solr 8.2.0
- Tomcat 9.0.27
Обновление тестовых зависимостей:
- AssertJ 3.13.2 (breaking changes)
- Hamcrest 2.1
- Mockito 3.1.0
- Junit 5.5.2 (Винтажный движок JUnit 5 по-прежнему поддерживает существующие тестовые классы на основе JUnit 4, так что здесь никаких существенных изменений)
Переход на Spring Boot 2.2
С 1 августа 2019 года Spring Boot 1.x закончил жизненный цикл. Если вы все еще используете приложения Spring Boot 1.x, пришло время обновиться!
Помните, что классы, методы и свойства, которые устарели в Spring Boot 2.1, были удалены в Spring Boot 2.2. Убедитесь, что вы не вызываете устаревшие методы перед обновлением. Проверьте примечания к выпуску для устаревшего в Spring Boot 2.1.
Больше информации вы сможете найти по следующим ссылкам:
- Примечания к выпуску Spring Boot 2.2
- Справочное руководство Spring Boot 2.2
- Документация по обновлению Spring Boot 2.1 до 2.2
- Официальное руководство по миграции (с Spring 1.5.x до Spring Boot 2)
Жмите +, если вы нашли эту статью полезной!
Есть вопросы или отзывы?
Ищите Twitter:
@TimvanBaarsen