- PVSM.RU - https://www.pvsm.ru -

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

Перевод статьи подготовлен специально для студентов курса «Разработчик на Spring Framework» [1].

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


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 [2]!

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

Глобальная ленивая инициализация 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) на глобальном уровне и явно отключить ленивую инициализацию для конкретного компонента.

Обобщим:

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

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

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

Для более подробной информации ознакомьтесь с документацией [3].

Изменения конечных точек 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

Наряду с этим изменением, теперь также возможно организовывать показатели работоспособности в группы [4].

Поддержка RSocket

RSocket [5] — это двоичный протокол связи, используемый для транспортировки байтовых потоков. Он делает возможными симметричные модели взаимодействия через асинхронную передачу сообщений по одному каналу.

Вместе с новым стартером для RSocket была добавлена обширная авто-конфигурация.

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

Для получения более подробной информации читайте документацию RSocket Spring Boot [6].

Поддержка 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 2.2? - 5

Это достаточно гиковская фича, но Spring Boot уже поддерживает (анимированные) пользовательские баннеры.

Начиная с Spring Boot 2.2 вы можете сделать свой баннер еще приятнее:

  • Файлы баннеров ASCII теперь могут использовать управляющие символы цвета ANSI 256 с помощью {AnsiColor.NNN} (где NNN — это код цвета [7]).
  • Теперь для (анимированных) графических баннеров вы можете установить свойство spring.banner.image.bitdepth равным 8. И свойство spring.banner.image.pixelmode в block для использования блочных символов ASCII.

Результат выглядит примерно так:

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

Источник: https://github.com/spring-projects/spring-boot/wiki/images/animated-ascii-art-256.gif [8]

Для простого примера улучшенного анимированного Spring Boot 2.2 баннера смотрите мой пример на Github [9].

Миграция с 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
logging.file был переименован в logging.file.name
logging.path был переименован в logging.file.path

Для полного обзора всех изменений смотрите лог изменений конфигурации Spring Boot 2.2! [10]

Устаревшее

Ознакомьтесь с примечаниями к выпуску для получения полного списка устаревших классов и свойств [11].

Некоторые изменения, которые следует отметить:

  • Поддержка времени Joda устарела в пользу java.time
  • Elasticsearch transport client и Jest client устарели в пользу других опций, таких как RestHighLevelClient и ReactiveElasticsearchClient, см. документацию [12] для получения более подробной информации.

Обновления зависимостей

Spring Boot 2.2 поставляется с множеством обновленных зависимостей.

Обновления зависимостей Spring:

Наиболее важные обновления других зависимостей:

Обновление тестовых зависимостей:

  • AssertJ 3.13.2 [35] (breaking changes [36])
  • Hamcrest 2.1 [37]
  • Mockito 3.1.0 [38]
  • Junit 5.5.2 [39] (Винтажный движок JUnit 5 по-прежнему поддерживает существующие тестовые классы на основе JUnit 4, так что здесь никаких существенных изменений)

Переход на Spring Boot 2.2

С 1 августа 2019 года Spring Boot 1.x закончил жизненный цикл [40]. Если вы все еще используете приложения Spring Boot 1.x, пришло время обновиться!

Помните, что классы, методы и свойства, которые устарели в Spring Boot 2.1, были удалены в Spring Boot 2.2. Убедитесь, что вы не вызываете устаревшие методы перед обновлением. Проверьте примечания к выпуску [41] для устаревшего в Spring Boot 2.1.

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

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

Есть вопросы или отзывы?
Ищите Twitter: @TimvanBaarsen

Автор: MaxRokatansky

Источник [46]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/java/336231

Ссылки в тексте:

[1] «Разработчик на Spring Framework»: https://otus.pw/Qu4p/

[2] start.spring.io: https://start.spring.io/

[3] документацией: https://docs.spring.io/spring-boot/docs/2.2.0.RELEASE/reference/html/spring-boot-features.html#boot-features-external-config-constructor-binding

[4] показатели работоспособности в группы: https://docs.spring.io/spring-boot/docs/2.2.0.RELEASE/reference/html/production-ready-features.html#health-groups

[5] RSocket: https://rsocket.io/

[6] RSocket Spring Boot: https://docs.spring.io/spring-boot/docs/2.2.0.RELEASE/reference/html//spring-boot-features.html#boot-features-rsocket

[7] код цвета: https://en.wikipedia.org/wiki/ANSI_escape_code

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

[9] мой пример на Github: https://github.com/j-tim/spring-boot-2.2-banner-example

[10] лог изменений конфигурации Spring Boot 2.2!: https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.2.0-Configuration-Changelog

[11] устаревших классов и свойств: https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.2-Release-Notes#deprecations-in-spring-boot-22

[12] документацию: https://docs.spring.io/spring-boot/docs/2.2.x-SNAPSHOT/reference/html//spring-boot-features.html#boot-features-elasticsearch

[13] Spring Framework 5.2.0: https://spring.io/projects/spring-framework#learn

[14] Spring AMQP 2.2.0: https://spring.io/projects/spring-amqp#learn

[15] Spring Data Moore RELEASE: https://spring.io/projects/spring-batch#learn

[16] Spring HATEOAS 1.0.0: https://spring.io/projects/spring-hateoas#learn

[17] Spring Integration 5.2.0: https://spring.io/projects/spring-integration#learn

[18] Spring Kafka 2.3.0: https://spring.io/projects/spring-kafka#learn

[19] Spring Security 5.2.0: https://spring.io/projects/spring-security#learn

[20] Spring Session Corn: https://spring.io/projects/spring-session#learn

[21] Elasticsearch 6.8.3 : https://www.elastic.co/guide/en/elasticsearch/reference/6.8/release-notes-6.8.3.html

[22] 6.5: https://www.elastic.co/guide/en/elasticsearch/reference/6.7/breaking-changes-6.5.html

[23] 6.6: https://www.elastic.co/guide/en/elasticsearch/reference/6.7/breaking-changes-6.6.html

[24] Flyway 6.0.6: https://flywaydb.org/blog/flyway-6.0.6

[25] Jackson 2.10.0: https://github.com/FasterXML/jackson/wiki/Jackson-Release-2.10

[26] Jersey 2.29.1: https://eclipse-ee4j.github.io/jersey.github.io/release-notes/2.29.1.html

[27] Kafka 2.3.0: https://www.apache.org/dist/kafka/2.3.0/RELEASE_NOTES.html

[28] Kotlin 1.3.50: https://github.com/JetBrains/kotlin/blob/1.3.50/ChangeLog.md

[29] Lombok 1.18.10: https://projectlombok.org/changelog

[30] Micrometer 1.3: https://github.com/micrometer-metrics/micrometer/releases/tag/v1.3.0

[31] Netty 4.1.42: https://netty.io/news/2019/09/25/4-1-42-Final.html

[32] Reactor Dysprosium: https://projectreactor.io/docs

[33] Solr 8.2.0: https://lucene.apache.org/solr/8_2_0/changes/Changes.html

[34] Tomcat 9.0.27: https://tomcat.apache.org/tomcat-9.0-doc/changelog.html

[35] AssertJ 3.13.2: https://assertj.github.io/doc/#assertj-core-3-13-2-release-notes

[36] breaking changes: https://assertj.github.io/doc/#assertj-core-3.12.0-breaking-changes

[37] Hamcrest 2.1: https://github.com/hamcrest/JavaHamcrest/releases/tag/v2.1

[38] Mockito 3.1.0: https://github.com/mockito/mockito/releases/tag/v3.1.0

[39] Junit 5.5.2: https://junit.org/junit5/docs/snapshot/release-notes/#release-notes-5.5.2

[40] закончил жизненный цикл: https://spring.io/blog/2018/07/30/spring-boot-1-x-eol-aug-1st-2019

[41] примечания к выпуску: https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.1-Release-Notes#deprecations-in-spring-boot-21

[42] Примечания к выпуску Spring Boot 2.2: https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.2-Release-Notes

[43] Справочное руководство Spring Boot 2.2: https://docs.spring.io/spring-boot/docs/2.2.0.RELEASE/reference/html/

[44] Документация по обновлению Spring Boot 2.1 до 2.2: https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.2-Release-Notes#upgrading-from-spring-boot-21

[45] Официальное руководство по миграции: https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.0-Migration-Guide

[46] Источник: https://habr.com/ru/post/475384/?utm_campaign=475384&utm_source=habrahabr&utm_medium=rss