Лекция 9. Spring Boot
Что такое Spring Boot
Spring Boot — дополнение к Spring, которое облегчает и ускоряет работу с ним. Представляет собой набор утилит, автоматизирующих настройки фреймворка.
Зачем нужен Spring Boot
Сам по себе Spring имеет:
- Большое количество зависимостей
- Множество сложных конфигураций (часто в XML)
У рядового разработчика это вызывает проблемы при знакомстве с фреймворком. Spring Boot — самый быстрый и популярный способ запуска Spring-проектов.
Типовые шаги старта без Spring Boot
Создавая каждое Spring-приложение, приходилось:
- Импортировать Spring-модули в зависимости от типа приложения
- Импортировать библиотеку web-контейнеров (для web)
- Импортировать сторонние библиотеки совместимых версий (Hibernate, Jackson)
- Конфигурировать DAO-компоненты: DataSource, transaction management
- Определить класс для загрузки всех конфигураций
Основные цели 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, Tomcatspring-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
События приложения отправляются в следующем порядке:
| № | Событие | Описание |
|---|---|---|
| 1 | ApplicationStartingEvent | В начале выполнения, перед обработкой (только регистрация слушателей) |
| 2 | ApplicationEnvironmentPreparedEvent | Когда Environment известно, но контекст ещё не создан |
| 3 | ApplicationContextInitializedEvent | ApplicationContext подготовлен, инициализаторы вызваны, но определения бинов ещё не загружены |
| 4 | ApplicationPreparedEvent | Перед обновлением, после загрузки определений бинов |
| 5 | ApplicationStartedEvent | После обновления контекста, перед вызовом командных средств |
| 6 | AvailabilityChangeEvent (LivenessState.CORRECT) | Приложение считается работающим |
| 7 | ApplicationReadyEvent | После вызова всех средств выполнения |
| 8 | AvailabilityChangeEvent (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) |
| Mockito | Java-фреймворк для мокирования объектов |
| JSONassert | Библиотека утверждений для JSON |
| JsonPath | XPath для JSON |
Преимущества DI для тестирования
Одно из главных преимуществ DI — облегчает модульное тестирование. Можно создавать объекты через new, не вовлекая Spring. Можно использовать mock-объекты вместо реальных зависимостей.
Аннотация @SpringBootTest
Spring Boot предоставляет @SpringBootTest — альтернативу стандартной @ContextConfiguration.
Поиск конфигурации:
- Аннотации
@*Testищут вашу первичную конфигурацию автоматически - Поиск начинается с пакета, содержащего тест
- Идёт до класса с
@SpringBootApplicationили@SpringBootConfiguration
MockMvc
По умолчанию @SpringBootTest не запускает сервер, а создаёт имитационное окружение для тестирования конечных веб-точек.
В Spring MVC можно запрашивать веб-точки с помощью MockMvc.