Лекция 9

01.01.0001

Лекция 9. Spring Boot

Что такое Spring Boot

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

Зачем нужен Spring Boot

Сам по себе Spring имеет:

  • Большое количество зависимостей
  • Множество сложных конфигураций (часто в XML)

У рядового разработчика это вызывает проблемы при знакомстве с фреймворком. Spring Boot — самый быстрый и популярный способ запуска Spring-проектов.

Типовые шаги старта без Spring Boot

Создавая каждое Spring-приложение, приходилось:

  1. Импортировать Spring-модули в зависимости от типа приложения
  2. Импортировать библиотеку web-контейнеров (для web)
  3. Импортировать сторонние библиотеки совместимых версий (Hibernate, Jackson)
  4. Конфигурировать DAO-компоненты: DataSource, transaction management
  5. Определить класс для загрузки всех конфигураций

Основные цели Spring Boot

  • Обеспечить быстрый старт для любых разработок на Spring
  • Возможность кастомизировать стандартное поведение
  • Предоставлять нефункциональные возможности: встроенные серверы, безопасность, метрики, проверка работоспособности, тестирование и конфигурация
  • Уйти от старых подходов с XML-конфигурациями

За счёт чего достигаются цели Spring Boot

Согласно spring.io :

  • ‘starter’ зависимости, облегчающие конфигурацию
  • Автоматическая конфигурация различных библиотек
  • Преднастроенный Application Server (Apache Tomcat)
  • Готовые рецепты для широко используемых подходов

Starter Packages

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

Примеры стартеров

  • spring-boot-starter-data-jpa — подтянет всё для работы с БД (драйверы, Hibernate)
  • spring-boot-starter-web — подтянет всё для веб-приложений: spring-webmvc, jackson-json, validation-api, Tomcat
  • spring-boot-starter-test — набор тестовых библиотек

Spring Boot собирает все общие зависимости и определяет их в одном месте, что позволяет разработчикам просто использовать их, а не «изобретать колесо» при создании каждого нового приложения.

Application Server (Apache Tomcat)

Apache Tomcat — комплект серверных программ от Apache Software Foundation для тестирования, отладки и исполнения веб-приложений на Java. Обычно называется контейнером сервлетов.

DispatcherServlet из Spring крутится внутри Tomcat. Spring Boot включает Tomcat «из коробки».

AutoConfiguration — автоматическая конфигурация

Spring Boot пытается автоматически настроить приложение на основе добавленных jar-зависимостей.

Как работает AutoConfiguration

  • Краеугольным камнем являются AutoConfiguration-классы, которые Spring Boot находит при запуске
  • Аннотация @EnableAutoConfiguration сообщает Spring Boot, что нужно «угадать» как настроить Spring
  • Если в classpath найдены spring-boot-starter-web (с Tomcat и Spring MVC) — настраивается веб-приложение
  • Если используется spring-boot-starter-jdbc — автоматически регистрируются DataSource, EntityManagerFactory, TransactionManager, читается информация из application.properties
  • Если БД не указана — настраивается резидентная база в памяти (если есть H2 или HSQL Driver)

Конфигурация в @SpringBootApplication

Аннотация @SpringBootApplication объединяет несколько других:

  • @EnableAutoConfiguration — включает автоконфигурацию
  • @ComponentScan — сканирует компоненты
  • @SpringBootConfiguration — помечает класс как конфигурацию

Постепенная замена автоконфигурации

Автоконфигурация работает неагрессивно — в любой момент можно начать определять свою конфигурацию, чтобы заменить определённые её части.

Если добавить свой DataSource — поддержка встроенной БД отключается.

Для отладки автоконфигурации запустите приложение с параметром:

--debug

Это активирует отладочные журналы и выведет отчёт об условиях на консоль.

Отключение автоконфигурации

Если определённые классы автоконфигурации не нужны, используйте атрибут exclude в @SpringBootApplication.

Spring Initializr

Spring Initializr — сервис, предоставляющий интерфейс для генерации заготовки проекта Spring со стандартными зависимостями.

  • Можно конфигурировать зависимости
  • Можно выбрать предпочитаемый сборщик
  • IntelliJ IDEA имеет встроенную интеграцию

Spring Beans и внедрение зависимостей

При использовании @ComponentScan (или @SpringBootApplication, которая её включает) все компоненты (@Component, @Service, @Repository, @Controller и др.) автоматически регистрируются как бины Spring.

Инструменты разработчика (DevTools)

spring-boot-devtools предоставляет инструменты для разработки. Автоматически деактивируются при запуске «упакованного» приложения.

Если приложение запускается через java -jar или специальный загрузчик — оно считается Production-сборкой. Управлять можно через spring.devtools.restart.enabled.

⚠️ Использовать DevTools в production нельзя — это угроза безопасности.

Автоматический перезапуск (Hot Module Reload)

Приложения с spring-boot-devtools автоматически перезапускаются при изменении файлов в classpath. Очень полезная функция при работе в IDE — обеспечивает быструю обратную связь.

Технология перезапуска

Spring Boot использует два загрузчика классов:

  • Основной загрузчик — для неизменяемых классов (сторонние jar)
  • Перезапускающий загрузчик — для активно разрабатываемых классов

При перезапуске единовременно используется перезапускающий, после чего создаётся новый. Поэтому перезапуск гораздо быстрее холодного запуска — основной загрузчик уже доступен и заполнен.

Цикл жизни Spring Application

События приложения отправляются в следующем порядке:

СобытиеОписание
1ApplicationStartingEventВ начале выполнения, перед обработкой (только регистрация слушателей)
2ApplicationEnvironmentPreparedEventКогда Environment известно, но контекст ещё не создан
3ApplicationContextInitializedEventApplicationContext подготовлен, инициализаторы вызваны, но определения бинов ещё не загружены
4ApplicationPreparedEventПеред обновлением, после загрузки определений бинов
5ApplicationStartedEventПосле обновления контекста, перед вызовом командных средств
6AvailabilityChangeEvent (LivenessState.CORRECT)Приложение считается работающим
7ApplicationReadyEventПосле вызова всех средств выполнения
8AvailabilityChangeEvent (ReadinessState.ACCEPTING_TRAFFIC)Приложение готово к обработке запросов
ApplicationFailedEventЕсли при запуске возникло исключение

Дополнительные события

Между ApplicationPreparedEvent и ApplicationStartedEvent также публикуются:

  • WebServerInitializedEvent — после готовности WebServer (ServletWebServerInitializedEvent или ReactiveWebServerInitializedEvent)
  • ContextRefreshedEvent — при обновлении ApplicationContext

Тестирование Spring приложений

Spring Boot предусматривает утилиты и аннотации, упрощающие тестирование. Поддержка обеспечивается двумя модулями:

  • spring-boot-test — основные элементы
  • spring-boot-test-autoconfigure — автоконфигурация тестов

Большинство разработчиков используют стартер spring-boot-starter-test, импортирующий оба модуля + полезные библиотеки.

Что внутри spring-boot-starter-test

БиблиотекаНазначение
JUnit 5Стандарт де-факто для модульного тестирования
Spring Test, Spring Boot TestУтилиты для тестирования Spring Boot
AssertJБиблиотека текучих утверждений
HamcrestБиблиотека объектов-сопоставителей (matchers)
MockitoJava-фреймворк для мокирования объектов
JSONassertБиблиотека утверждений для JSON
JsonPathXPath для JSON

Преимущества DI для тестирования

Одно из главных преимуществ DI — облегчает модульное тестирование. Можно создавать объекты через new, не вовлекая Spring. Можно использовать mock-объекты вместо реальных зависимостей.

Аннотация @SpringBootTest

Spring Boot предоставляет @SpringBootTest — альтернативу стандартной @ContextConfiguration.

Поиск конфигурации:

  • Аннотации @*Test ищут вашу первичную конфигурацию автоматически
  • Поиск начинается с пакета, содержащего тест
  • Идёт до класса с @SpringBootApplication или @SpringBootConfiguration

MockMvc

По умолчанию @SpringBootTest не запускает сервер, а создаёт имитационное окружение для тестирования конечных веб-точек.

В Spring MVC можно запрашивать веб-точки с помощью MockMvc.