Уже в ноябре 2025 выходит Spring Boot 4 — масштабный релиз, построенный на фундаменте Spring Framework 7.0.0 и Jakarta EE 11. Это не просто очередное обновление, а важный этап в развитии всей Java-платформы: новые возможности для REST и безопасности, улучшенная работа с Kotlin и GraalVM, мощная поддержка облаков и нативных образов, а также инструменты для создания отказоустойчивых приложений.

? Эта статья — больше, чем просто перевод: в ней собрано большое кол-во комментариев от экспертов Spring АйО.


Spring Boot 4 выйдет в ноябре 2025 года (milestone версии уже доступны) и основан на совершенно новой версии Spring Framework 7.0.0. Если вы разрабатываете современные Java-приложения, это обновление предлагает множество новых фич, с которыми стоит ознакомиться.

После масштабной миграции в Spring Boot 3.x на Jakarta EE 10, Spring Boot 4 продолжает курс на модернизацию и основывается на Jakarta EE 11. Spring Boot 4 также предлагает поддержку современных версий JDK и практик облачной разработки. Это важный этап, который задаёт вектор развития Java на ближайшее десятилетие.

В этой статье мы рассмотрим ключевые изменения и их значение для ваших проектов.

Обновления платформы Spring Boot 4

  1. Поддержка Java и JVM
    – Минимальная версия JDK: 17 (LTS и широко используется).
    – Рекомендуемая версия JDK: 25 (релиз ожидается в сентябре 2025 года).
    – Полная совместимость с GraalVM 24 для сборки нативных образов.

  2. Совместимость с Jakarta EE 11
    – Servlet 6.1 для современных веб-API.
    – JPA 3.2 + Hibernate ORM 7.0 для более эффективной работы с данными.
    – Bean Validation 3.1 с улучшенными ограничениями и поддержкой Kotlin/records.

  3. Поддержка Kotlin 2.2
    – Поддержка новых возможностей языка Kotlin 2.2.
    – Улучшенная работа с корутинами.
    – Более тесная интеграция со сборкой Gradle.

  4. Облачные технологии и контейнеризация
    – Улучшенные Buildpacks с ускоренным созданием слоёв для образа.
    – Более эффективная сборка Docker-образов.
    – Интеграция Micrometer 2.x и OpenTelemetry.

  5. Продуктивность и удобство разработки
    – Обновления Spring Boot CLI (управление зависимостями, генерация шаблонов для тестов).
    – Новые эндпоинты в Actuator.
    – Более простое управление свойствами и профилями.

  6. Безопасность
    – Основано на Spring Security 7.
    – Улучшенная интеграция с OAuth 2.2 и OIDC.
    – Улучшенные криптографические настройки по умолчанию.

  7. Подготовка к будущему: Spring AI и нативные API
    – Начальная поддержка интеграции со Spring AI.
    – Улучшенный API для “подсказок” GraalVM при сборке нативных образов.

Комментарий от эксперта Spring АйО, Михаила Поливахи

Под "улучшенным API для “подсказок” GraalVM" подразумевается reflection/resource/serialization и т.п. хинты, которые Spring Framework предоставляет GraalVM Native Image-у во время генерации Native Image Heap.

Новые возможности Spring Framework 7

1. Элегантное версионирование API

Spring Framework 7 теперь поддерживает версионирование API напрямую в аннотации @RequestMapping, что упрощает сопровождение нескольких версий REST-эндпоинтов и обеспечивает обратную совместимость.

@RestController
@RequestMapping("/api/products")
public class ProductController {

    @RequestMapping(value = "/search", version = "1")
    public List<ProductV1> searchProductsV1(@RequestParam String query) { ... }

    @RequestMapping(value = "/search", version = "2")
    public ProductSearchResponseV2 searchProductsV2(@RequestParam String query,
                                                    @RequestParam(defaultValue = "10") int limit) { ... }
}

Вы можете указать нужную версию с помощью заголовка Version в HTTP-запросе. Контроллер автоматически направит запрос в соответствующий метод в зависимости от указанной версии.

Пример вызова версии 1 API (возвращает простой список продуктов):

GET /api/products/search?query=laptop
Version: 1

Пример вызова версии 2 API (возвращает расширенный поиск с метаданными):

GET /api/products/search?query=laptop&limit=20
Version: 2
Комментарий от эксперта Spring АйО, Михаила Поливахи

На деле, не обязательно передавать версию в HTTP header-е. Способы передачи версии API можно довольно легко конфигурировать. Позже, мы выпустим об этом отдельный материал.

2. Безопасность при работе с null с помощью JSpecify

Spring Framework 7 перешёл на использование аннотаций JSpecify, что повышает безопасность при работе с null и улучшает интеграцию с Kotlin. JSpecify предоставляет более точные контракты на null-значения для параметров методов, возвращаемых значений и полей, помогая разработчикам обнаруживать потенциальные ошибки, связанные с null, на этапе компиляции.

Комментарий от эксперта Spring АйО, Михаила Поливахи

На самом деле, Spring Framework 6 уже начал интеграцию jspecify аннотаций, просто именно с выходном Spring Framework 7 поддержка jspecify стала массовой во всех проектах Spring (Data, Security и т.д.)

Пример использования аннотаций JSpecify в компоненте Spring:

import org.jspecify.annotations.Nullable;
import org.jspecify.annotations.NonNull;

@Component
public class UserService {
    public @NonNull String getUserName(@Nullable String userId) {
        if (userId == null) {
            return "Unknown";
        }
        // fetch user name logic
        return "Alice";
    }
}

В этом примере параметр userId может быть null, но метод гарантирует возвращаемое значение, отличное от null. Это помогает предотвратить ошибки типа NullPointerException и повышает надёжность кода, особенно при интеграции с Kotlin или другими языками с безопасной работой с null.

3. Программная регистрация бинов с помощью BeanRegistrar

Spring Framework 7 представляет контракт BeanRegistrar, позволяющий разработчикам программно регистрировать бины с большей гибкостью. Это особенно полезно в сложных сценариях, когда необходимо динамически регистрировать несколько бинов — за пределами возможностей, предоставляемых аннотацией @Bean.

Комментарий от эксперта Spring АйО

Эксперт сообщества, Поливаха Михаил, уже подробно описывал данный API в уже выпущенной нами ранее статье.

@Configuration(proxyBeanMethods = false)
public class MyBeanConfig implements BeanRegistrar {
    @Override
    public void registerBeans(BeanDefinitionRegistry registry) {
        registry.registerBeanDefinition("myBean", new RootBeanDefinition(MyBean.class));
    }
}

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

4. Улучшенная поддержка Optional в выражениях SpEL

SpEL (Spring Expression Language) теперь предлагает расширенную поддержку типов Optional, включая null-safe вызовы и оператор Элвиса (?:). Это упрощает работу с Optional-значениями в конфигурациях и определениях бинов.

@Value("#{userService.findUser(#userId)?.orElse('Guest')}")
private String userName;

Вы можете безопасно обрабатывать отсутствующие значения и избегать NullPointerException в конфигурации и связывании бинов.

5. Функционал отказоустойчивости: @Retryable, @ConcurrencyLimit, @EnableResilientMethods

Новые аннотации, такие как @Retryable и @ConcurrencyLimit, позволяют создавать более устойчивые приложения, реализуя логику повторных попыток и ограничения параллелизма прямо в методах сервисов.

Аннотация @EnableResilientMethods активирует эти возможности для ваших бинов.

@Service
@EnableResilientMethods
public class PaymentService {
    @Retryable(maxAttempts = 3)
    public void processPayment() {
        // logic that may fail and should be retried
    }

    @ConcurrencyLimit(maxConcurrentCalls = 5)
    public void updateBalance() {
        // logic with concurrency limit
    }
}

Вы можете добавить повторные попытки и контроль параллелизма в бизнес-логику с помощью простых аннотаций, повышая надёжность и масштабируемость приложения.

Комментарий от эксперта Spring АйО, Михаила Поливахи

Тут всё сложнее. На деле, многие знают, что ранее существовал проект Spring Retry. Он существует и сейчас. Это отдельный модуль Spring, который не входит в основной trunk Spring Framework. 

В рамках Spring Framework 7 было принято решение потихоньку интегрировать этот модуль в основной trunk, в связи с чем у нас появляется "новая" аннотация @Retryable, которая, по сути, является аналогом уже существующей @Retryable из Spring Retry модуля. Соотвественно, вместе с @Retryable у появился и некий дополнительный набор аннотаций, такой как @ConcurrencyLimit и @EnableResilientMethods, которая по сути просто импортирует BeanPostProcessor-ы, которые обрабатывают новую @Retryable и @ConcurrencyLimit.

6. Отдельная конфигурация для HTTP-клиентов с помощью @ImportHttpServices

Spring Framework 7 вводит аннотацию @ImportHttpServices, упрощающую настройку и группировку HTTP-клиентов. Это оптимизирует конфигурацию приложений, взаимодействующих с несколькими внешними сервисами.

@Configuration(proxyBeanMethods = false)
@ImportHttpServices(group = "weather", types = {WeatherClient.class})
public class HttpClientConfig {}

Вы можете эффективно организовать и настроить несколько HTTP-клиентов, сократив boilerplate код и повысив удобство поддержки.

Комментарий от эксперта Spring АйО, Михаила Поливахи

Здесь автор не поясняет, но на деле речь идёт об относительно новом API Http Interfaces, который появился в Spring Framework 6.1. Про это мы тоже выпустим отдельный пост, но пока можете смотреть на это нововведение так, что Spring Cloud продолжает инвестировать в свой API Http Interfaces, что не удивительно, т.к. это целевой API, который будет заменять Spring Cloud OpenFeign.

7. Поддержка потоковой передачи с InputStream и OutputStream в HTTP-клиентах

HTTP-клиенты теперь поддерживают потоковую передачу тел запросов и ответов с использованием InputStream и OutputStream. Это особенно полезно для эффективной обработки больших файлов и потоков данных.

@PostMapping("/upload")
public void uploadFile(InputStream inputStream) {
    // process large file stream
}

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

8. Новый JmsClient и улучшения в JdbcClient

В Spring Framework 7 представлен новый JmsClient — современный API для работы с JMS (Java Message Service), а также усовершенствованный JdbcClient для более простой и гибкой работы с базами данных.

JmsClient jmsClient = JmsClient.create(connectionFactory);
jmsClient.send("queue", "Hello World");

JdbcClient jdbcClient = JdbcClient.create(dataSource);
List<User> users = jdbcClient.sql("SELECT * FROM users").query(User.class).list();

Вы получаете более лаконичный и современный API для обмена сообщениями и доступа к данным, что сокращает boilerplate код и повышает продуктивность разработки.

9. Централизованная конфигурация HTTP-конвертеров сообщений

Spring Framework 7 предлагает централизованную настройку HTTP-конвертеров сообщений, что упрощает кастомизацию процессов сериализации и десериализации данных в веб-приложениях.

@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void configureMessageConverters(HttpMessageConverters.ServerBuilder builder) {
        builder.jsonMessageConverter(new JacksonJsonHttpMessageConverter(JsonMapper.builder().build()));
    }
}

Вы можете легко настраивать логику сериализации и десериализации для ваших API в одном месте, повышая согласованность и удобство сопровождения кода.

10. Новый RestTestClient для тестирования REST API

RestTestClient — это новый инструмент для тестирования REST API, предоставляющий лаконичный API и поддержку как реальных серверов, так и мок-окружений. Он упрощает написание и сопровождение интеграционных тестов для ваших эндпойнтов.

RestTestClient client = RestTestClient.bindToServer("http://localhost:8080");
client.get().uri("/api/user").exchange().expectStatus().isOk();

Вы можете писать лаконичные и читаемые интеграционные тесты для ваших REST-эндпойнтов, повышая масштаб покрытия и надёжность тестирования.

11. Улучшенное сопоставление путей с расширенной поддержкой PathPattern

В Spring MVC улучшен механизм сопоставления путей благодаря расширенной поддержке PathPattern, которая заменяет устаревшие варианты и обеспечивает более мощное и гибкое сопоставление URI-шаблонов в контроллерах.

Комментарий от эксперта Spring АйО, Михаила Поливахи

Автор не поясняет, что такое PathPattern. Не многие знают, но ещё в Spring Framework 5, Spring MVC переехал с AntPathMatcher на PathPattern. На то был ряд причин, но сейчас это не важно. Суть в том, что теперь пути для HTTP эндпоинтов поддерживают более широкий спектр паттернов.

@RequestMapping("/**/pages/{pageName}")
public String handlePage(@PathVariable String pageName) {
    return pageName;
}

Вы можете задавать более гибкие и выразительные шаблоны URI для контроллеров, упрощая маршрутизацию и проектирование эндпоинтов.

12. Удаленный и deprecation API

Spring Boot 4 и Spring Framework 7 исключили ряд устаревших функций и пометили как устаревшие некоторый API, чтобы упростить экосистему и стимулировать использование современных практик разработки.

Removed / Deprecated

Alternative

spring-jcl

Apache Commons Logging

javax.annotation, javax.inject

jakarta.annotation, jakarta.inject

suffixPatternMatch, trailingSlashMatch, favorPathExtension

Explicit media types / URI templates

XML-based Spring MVC config

Java-based WebMvcConfigurer

JUnit 4

JUnit 5

Jackson 2.x

Jackson 3.x

Ниже представлены подробности по каждому удалённому и устаревшему элементу.

Изменения в модулях

Модуль spring-jcl был удалён в пользу использования Apache Commons Logging, что упрощает инфраструктуру логирования. Кроме того, аннотации из пакетов javax.annotation и javax.inject больше не поддерживаются — необходимо перейти на их аналоги из пространства имён Jakarta: jakarta.annotation и jakarta.inject.

Комментарий от команды эксперта Spring АйО Михаила Поливахи

Эмпирическим путем могу сказать, что большая часть людей совершенно не знала про spring-jcl и не использовала его напрямую. Если не использовали - то удаление никак на вас не повлияет. Этот модуль по сути был небольшой прослойкой между Java Commons Loggin (JCL, оно же Apache Commons Logging) и Spring. На деле, уже давно были планы дропнуть этот модуль, т.к. в нем, как показала практика, нужды особо нет

Упрощение сопоставления путей

В Spring MVC были удалены несколько опций маршрутизации путей. Такие функции, как suffixPatternMatch, trailingSlashMatch и favorPathExtension, больше не поддерживаются в аннотированных методах контроллеров и при согласовании форматов контента.

Ранее можно было использовать маршрутизацию на основе суффиксов, например:

@RequestMapping(value = "/users.json", produces = "application/json")
public List<User> getUsersJson() { ... }

Или настроить сопоставление путей по суффиксам в конфигурации на Java следующим образом:

@Configuration
public class WebConfig implements WebMvcConfigurer {

@Override
public void configurePathMatch(PathMatchConfigurer configurer) {
configurer.setUseSuffixPatternMatch(true);
}
}

Эти опции теперь удалены. Вместо них рекомендуется использовать явные медиа-типы и шаблоны URI, обеспечивающие более чистую и предсказуемую маршрутизацию.

Устаревание конфигурации на XML

Конфигурация Spring MVC с использованием XML теперь считается устаревшей. Если вы всё ещё используете конфигурацию на основе XML, например:

<mvc:annotation-driven />
<mvc:resources mapping="/resources/**" location="/public/" />
<mvc:view-controller path="/home" view-name="home" />

Рекомендуется перейти на конфигурацию на основе Java, например:

@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/home").setViewName("home");
    }
}

Обновления в тестировании и сериализации

Поддержка JUnit 4 и Jackson 2.x объявлена устаревшей. Рекомендуется переход на JUnit 5 и более новые версии Jackson для повышения производительности и использования современных возможностей тестирования.

Чек-лист миграции

  • Обновитесь до JDK 17+ (рекомендуется JDK 25).

  • Замените необходимые импорты javax.* на jakarta.*.

  • Проверьте настройки маршрутизации в MVC — механизмы сопоставления по суффиксу (suffixPatternMatch) и завершающему слэшу (trailingSlashMatch) удалены.

  • Перейдите с конфигураций на XML к конфигурации на Java.

  • Обновите тесты: используйте JUnit 5 и Jackson 3.x.

  • Проверьте "подсказки" GraalVM, если используете нативные образы.

Изменения, которые уже можно внедрять: переход на Java 17+, обновление пространств имён пакетов, отказ от XML-конфигураций и переход на JUnit 5 — это поможет упростить миграцию и подготовить проект заранее.

Заключение

Spring Boot 4 и Spring Framework 7 — это значительный шаг вперёд для Java-разработки, предлагающий больше безопасности, гибкости и новых возможностей для современных приложений. Если вы планируете обновление, внимательно изучите изменения и тщательно протестируйте проект перед переходом в продакшн.
Актуальная версия Spring Boot 3.5.x будет поддерживаться как open-source до июня 2026 года, поэтому планируйте миграцию заранее.

Удачной разработки!


Присоединяйтесь к русскоязычному сообществу разработчиков на Spring Boot в телеграм — Spring АйО, чтобы быть в курсе последних новостей из мира разработки на Spring Boot и всего, что с ним связано.

Комментарии (1)


  1. Shakior
    27.08.2025 21:13

    Может кто подсказать чем разработка для облака отличается от разработки под деплой в тот же кубер?