Найти тему

Релиз Spring Boot 3.1.0

Оглавление

18 мая была опубликована новая версия популярного фреймворка Spring Boot - 3.1. Предлагаю краткий обзор наиболее значимых изменений. Оригинальные заметки о релизе вы можете прочитать здесь: https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.1-Release-Notes

Соединения с сервисами

В Spring Boot 3.1 реализована новая концепция соединений с сервисами. Такие соединения представлены в приложении компонентами, реализующими интерфейс ConnectionDetails. Эти компоненты предоставляют необходимые данные для подключения к удалённым сервисам вроде баз данных или брокеров очередей сообщений, а автоконфигурации Spring Boot теперь могут их использовать для создания подключений. Если такие компоненты представлены в контексте приложения, то они будут иметь наивысший приоритет при создании подключения к сервисам. Впрочем, дополнительные параметры из файлов свойств, не имеющие отношения к самому соединению, будут и дальше использоваться.

В качестве примера можно привести JdbcConnectionDetails для описания настроек JDBC-соединения.

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

И это нововведение само по себе может показаться неочевидным для разработчика, использующего Spring Boot, если не рассказать о двух других нововведениях Spring Boot 3.1.0: поддержки Docker Compose и Testcontainers, поэтому предлагаю их рассмотреть тоже.

Поддержка Docker Compose

Новый модуль spring-boot-docker-compose предоставляет интеграцию с Docker Compose. При запуске приложения данная интеграция будет искать в текущей рабочей директории файлы Docker Compose, по умолчанию это следующие файлы:

  • compose.yaml
  • compose.yml
  • docker-compose.yaml
  • docker-compose.yml

При необходимости можно использовать и другие файлы, указывая их в параметре spring.docker.compose.file.

По умолчанию сервисы, объявленные в конфигурационном файле, будут запущены при помощи команды docker compose up, а в контексте приложения будут автоматически зарегистрированы компоненты ConnectionDetails с параметрами подключения для запущенных сервисов. Благодаря этому для подключения к сервисам не потребуется никакого дополнительного кода или параметров.

При завершении выполнения приложения все запущенные сервисы будут автоматически останавливаться при помощиdocker compose down. Жизненный цикл и команды для запуска и остановки сервисов можно сконфигурировать при помощи параметров spring.docker.compose.lifecycle-management, spring.docker.compose.startup.command, и spring.docker.compose.shutdown.command.

Поддержка Testcontainers

В Spring Boot 3.1 наконец-то была добавлена поддержка Testcontainers, и теперь управление зависимости для последнего включено в Spring Boot. При желании используемую версию Testcontainers можно указать при помощи параметра testcontainers.version.

Сделано это в первую очередь для запуска приложения в режиме разработки, когда вам требуется запустить сервис и вручную протестировать его функциональность, но чтобы при этом использовать сервисы, вроде тех же баз данных, развёрнутые в Docker. А автоматизацией запуска этих сервисов занимается Spring Boot и Testcontainers. Для использования этой возможности потребуется модуль spring-boot-testcontainers, а так же класс для запуска приложения в тестовом режиме.

public class TestMyApplication {
public static void main(String[] args) {
SpringApplication.from(MyApplication::main).run(args);
}
}

В данном случае MyApplication - это главный класс вашего приложения.

Так же при помощи Testcontainers можно регистрировать компоненты подключения к сервисам в контексте приложения при помощи аннотации @ServiceConnection:

@SpringBootTest
@Testcontainers
class MyIntegrationTests {

@Container
@ServiceConnection
static PostgreSQLContainer postgreSqlContainer = new PostgreSQLContainer<>("postgres:15");
}

Для созданного контейнера будет автоматически зарегистрирован в контексте приложения компонент с параметрами подключения к PostgreSQL и в дальнейшем использован при создании DataSource.

Spring Security 6.1 и подготовка к 7.0

Казалось бы Spring Security 6 недавно только релизнулся, а подготовка к релизу 7 версии уже началась. И разработчики Spring Security решили, что пора бы избавиться от некоторых DSL на основе цепочек методов для настройки контекста безопасности приложения. Но проблем особых это не должно создать, так как параллельно существуют DSL на основе лямбда-выражений, и всё, что находится между начальным методом цепочки DSL (например .httpBasic()) и конечным (.and()) переедет внутрь лямбда выражения.

Было:

http
.httpBasic().realmName("MyRealm").and()

Стало:

http
.httpBasic(httpBasic -> httpBasic.realmName("MyRealm))

Прочее

Из прочих изменений можно выделить появление автоконфигурации для Spring Security Authorization Server, отказ от Apache HttpClient 4 в пользу его 5 версии, обновление Hibernate до 6.2, Mockito - до 5.3, а так же обновление прочих зависимостей.

Обсудить новость можно тут