Автоконфигурация Spring Boot, как следует из названия, надеется, что сможет автоматически настроить и избавить нас от страданий конфигурации. Так как он должен быть настроен автоматически, он должен решить три проблемы:
1. Какие условия соблюдены?
2. Создать эти бобы?
3. Какими свойствами обладает созданный бин?
Например: когда мы создаем проект springboot и вводим зависимость spring-boot-starter-web, он автоматически создаст для нас tomcat с портом 8080 и настроит собственный порт проекта (server.port) через файл конфигурации application. ямл.
Кратко объясните:
1. Какие условия? Потому что мы вводим зависимость spring-boot-starter-web.
2. Какие bean-компоненты создаются?Создайте встроенный кот и запустите его.
3. Какими свойствами обладает созданный бин? Пользовательский порт (server.port) настраивается через application.yaml.
В исходном коде springboot есть такой класс: EmbeddedWebServerFactoryCustomizerAutoConfiguration
Загрузите исходный код и перейдите в облако кода (быстрый пакет)
Объявляет, что это класс конфигурации Spring, добавляя к классу аннотацию @Configuration.
Объявите метод для создания Spring Bean, добавив к методу аннотацию @Bean.
В к классу добавляется аннотация @Configuration, объявляющая, что это класс конфигурации. Поскольку его целью является автоконфигурация, к имени класса добавляется суффикс AutoConfiguration.
— это класс конфигурации, используемый для инициализации Tomcat.
Таким образом, мы можем прийти к выводу, что проблема «какие компоненты создавать» может быть решена с помощью класса конфигурации, аннотированного @Configuration.
К классу добавляется условная аннотация @ConditionalOnWebApplication, указывающая, что текущий класс конфигурации может действовать только тогда, когда текущий проект является веб-проектом. В проекте SpringBoot типы проектов делятся на веб-проекты (с использованием SpringMVC или WebFlux) и не-веб-проекты. Таким образом, нам легко понять, почему класс конфигурации EmbeddedWebServerFactoryCustomizerAutoConfiguration требует, чтобы тип проекта был веб-проектом, а для создания встроенного веб-сервера необходим только веб-проект.
Условная аннотация @ConditionalOnClass указывает, что текущий класс конфигурации может вступить в силу, только если текущий проект имеет указанный класс. (строка ниже рисунка 1.2 выше).
Таким образом, мы можем прийти ко второму выводу: с помощью условной аннотации мы можем решить проблему «какие условия выполняются?».
В используйте аннотацию @EnableConfigurationProperties, чтобы класс свойства конфигурации ServerProperties вступил в силу. Аннотация @ConfigurationProperties определена в SpringBoot для объявления класса свойств конфигурации и пакетного внедрения элементов конфигурации с указанным префиксом в класс.
В , когда создается объект TomcatWebServerFactoryCustomizer, в него будут переданы свойства ServerProperties в качестве конфигурации создаваемого впоследствии веб-сервера. Другими словами, мы можем настроить конфигурацию веб-сервера, изменив элементы конфигурации в файле конфигурации.
Таким образом, мы можем прийти к третьему выводу, настроив свойства, можно решить проблему «свойства созданного бина?».
Пока у нас есть четкое понимание того, как SpringBoot решает три поднятые нами выше проблемы, но добиться автоматической настройки пока не получается. Например, представленный нами spring-boot-starter-web зависит от того, как Spring Boot знает, какие классы конфигурации сканировать.
Когда мы запускаем приложение Spring Boot с помощью метода SpringApplication#run(Class> primarySource, String... args), есть очень важный компонент, класс SpringFactoriesLoader, который будет читать файл spring.factories в META- Каталог INF, чтобы получить классы конфигурации, определенные каждой структурой, которые необходимо настроить автоматически.
Таким образом, исходный аннотированный класс конфигурации @Configuration обновляется до класса автоматической конфигурации класса. Таким образом, после того как SpringBoot получит класс конфигурации, который необходимо настроить автоматически, он может автоматически создать соответствующий Bean-компонент для выполнения функции автоматической настройки.
Spring Boot соглашается прочитать файлы конфигурации, такие как application.yaml и application.properties, чтобы реализовать настройку пользовательских свойств для создания bean-компонентов и даже отменить создание bean-компонентов с помощью аннотации @ConditionalOnProperty.
Пользовательская стартовая реализация
Запустите проект и запустите два модуля с обеих сторон
модуль1 используется для обеспечения стартера, модуль2 используется для использования стартера. (Номер порта, напечатанный в конце, показывает, успешно ли мы его процитировали)
Это класс свойств конфигурации, который должен считывать свойства с префиксом lmd.server в application.properties (обратите внимание, что этот application.properties является вашим файлом конфигурации в module2).
Следующий класс автоподключения конфигурации
Затем введите зависимости модуля1 в файл pom.xml модуля2.
Затем определите свойства в application.properties модуля 2 (мы устанавливаем порт 8011).
Последний шаг — запустить класс запуска module2 напрямую.
Наконец, посмотрите успешную ссылку на пользовательский стартер.
Примечание: файл pom модуля1
4.0.0 com.example demo 0.0.1-SNAPSHOT demo Demo project for Spring Boot
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<spring-boot.version>2.3.0.RELEASE</spring-boot.version>
</properties>
<dependencies>
<!-- 引入 Spring Boot Starter 基础库 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>2.1.8.RELEASE</version>
</dependency>
</dependencies>
pom файл модуля2
4.0.0 com.springboot stater 0.0.1-SNAPSHOT stater Demo project for Spring Boot
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
</properties>
<dependencies>
<dependency>
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>