Что нового в Spring Boot 2.2?

Автор оригинала: Tim van Baarsen
  • Перевод
Перевод статьи подготовлен специально для студентов курса «Разработчик на Spring Framework».




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 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.

Больше информации вы сможете найти по следующим ссылкам:



Жмите +, если вы нашли эту статью полезной!

Есть вопросы или отзывы?
Ищите Twitter: @TimvanBaarsen
  • +20
  • 4,8k
  • 4
OTUS. Онлайн-образование
690,89
Цифровые навыки от ведущих экспертов
Поделиться публикацией

Комментарии 4

    0

    Спасибо за перевод! Думаю, стоит так же дать ссылку на новость от самой команды Spring Boot в официальном блоге Spring.


    Поддержка сканирования classpath для @ConfigurationProperties

    Это уже откатили в версии 2.2.1, теперь такое поведение нужно явно включать используя @ConfigurationPropertiesScan


    Автор оригинала во многом пересказывает официальный анонс, но пропускает самый первый пункт:


    As part of our ongoing efforts to improve performance, we’ve made some significant progress in Spring Boot 2.2 on top of those made in 2.1. Applications will now start even faster and consume less memory while they do so. This can be particularly beneficial in environments with very tight memory constraints.

    В Spring Boot 2.2 было проделано огромное количество работы направленной на уменьшение времени запуска (старт менее чем за секунду для некоторых приложений), использования памяти, нагрузки на GC.

      0
      Анимированные банеры — просто огонь!!! Пошел реализовывать!!! А если серьезно, то спасибо за материал)
        +1

        В консоли — да, выглядит здорово. А что насчет логов? Там будет куча голых фреймов подряд?

          0
          Как раз с коллегами обсуждали, как это будет в Kibana смотреться)

      Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

      Самое читаемое