SpringBootApplication Annotation Статьи серии Sprilboot

Spring Boot задняя часть

предисловие

Класс запуска Springboot может быть очень простым, и двумя наиболее важными частями являются определение аннотации (@SpringBootApplication) и определение класса (SpringApplication.run), в этой статье в основном анализируется его@SpringBootApplicationАннотация, в следующей статье будет проанализировано его определение класса.

@SpringBootApplication
public class Application {


    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

который относится к«Секрет Спрингбут»Анализ внутри также является кратким изложением обучения.

Аннотация @SpringBootApplication

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
    excludeFilters = {@Filter(
    type = FilterType.CUSTOM,
    classes = {TypeExcludeFilter.class}
), @Filter(
    type = FilterType.CUSTOM,
    classes = {AutoConfigurationExcludeFilter.class}
)}
)
public @interface SpringBootApplication {
    .....
}

Кажется, что так много аннотаций, на самом деле@SpringBootApplicationЭто структура «трех тел», и важны только три аннотации:

  • @Configuration
  • @EnableAutoConfiguration
  • @ComponentScan

Почему@SpringBootApplication注解не содержит@Configuration, на самом деле в@SpringBootConfigurationв

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration
public @interface SpringBootConfiguration {
}

@Springbootconfiguration, унаследованный от @configgation, две функции согласуются с текущим классом, отмеченной конфигурацией класса, И он устанавливает текущую декларацию класса в течение одного или нескольких аннотированных примеров метода @Bean Meaded Container в пружину, а имя экземпляра - это имя метода.

На самом деле, если мы используем следующий класс запуска Springboot, все приложение SpringBoot по-прежнему может быть эквивалентно предыдущему классу запуска.

@Configuration
@EnableAutoConfiguration
@ComponentScan
public class Application {


    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

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

@Configuration

здесь@Configurationэто тот, который используется классом конфигурации контейнера Spring IoC в форме JavaConfig@Configuration, поэтому класс запуска здесь помечен@ConfigurationПосле этого это фактически класс конфигурации контейнера IoC.

Предыдущая конфигурация XML выглядела так:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"
       default-lazy-init="true">
    <!--bean定义-->
</beans>

Текущая конфигурация JavaConfig выглядит так, эффект тот же, аннотация помечена как класс конфигурации

@Configuration
public class Application{
    //bean定义
}

больше о@Configurationи@BeanДля объяснения обратитесь к статье:Управление bean-компонентами Spring с конфигурацией Java

@ComponentScan

Функция @ComponentScan состоит в том, чтобы автоматически сканировать и загружать квалифицированные определения компонентов или компонентов и, наконец, загружать эти определения компонентов в контейнер.Мы можем указать область автоматического сканирования @ComponentScan через атрибуты, такие как basePackages.Если не указано, среда Spring по умолчанию реализует сканирование из пакета, который объявляет класс, в котором находится @ComponentScan, который не указан по умолчанию, поэтому запуск SpringBoot class лучше всего размещать в корневом пакете.

@EnableAutoConfiguration

Вы помните различные определения аннотаций, предоставляемые средой Spring, имена которых начинаются с @Enable? Например@EnableScheduling,@EnableCaching,@EnableMBeanExportЖдать,@EnableAutoConfigurationКонцепция и «способ ведения дел» на самом деле совпадают.с помощью@ImportПоддержка сбора и регистрации контекстно-зависимых определений bean-компонентов:

  • @EnableSchedulingОн загружается в контейнер IOC с помощью @IMPORT.
  • @EnableMBeanExportЭто загрузить определения фанатов, связанных с jmx в контейнер IOC через @import

И @EnableAutoConfiguration тоже с помощью @Import,Загрузите все определения bean-компонентов, подходящие для автоматической настройки, в контейнер Ioc, и все.

@EnableAutoConfiguration также является составной аннотацией, определяемой следующим образом:

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration {
    String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";

    Class<?>[] exclude() default {};

    String[] excludeName() default {};
}

Среди них важнейшее@Import(AutoConfigurationImportSelector.class), с помощьюAutoConfigurationImportSelectorЭтот класс,@EnableAutoConfigurationМожет помочь SpringBoot все приемлемые приложения будут @configuration загружены в текущий пружинный запуск, создайте и используйте контейнер IOC

springboot

AutoConfigurationImportSelector

До SpringBoot 1.5 использованиеEnableAutoConfigurationImportSelector, который наследуется отAutoConfigurationImportSelector, через 1,5,EnableAutoConfigurationImportSelectorБольше не рекомендуется, но рекомендуетсяAutoConfigurationImportSelector.

когда это выполняется

Теперь, когда мы знаем, что класс AutoConfigurationImportSelector представлен в @EnableAutoConfiguration, как он реализован?

Когда Springboot запустится, он будет использовать ConfigurationClassParser для анализа класса конфигурации, измененного @Configuration, а затем обработает случай, когда класс изменен другими аннотациями, такими как аннотация @Import, аннотация @ComponentScan, аннотация @Bean и т. д.

Если в аннотации будет найден @Import(ImportSelector), будет создан соответствующий объект importSelector и будет вызван его метод selectImports, а AutoConfigurationImportSelector — это класс реализации ImportSelector. Дополнительный анализ ConfigurationClassParser см. в статье:Примечания к записи на весенние занятия

selector
Таким образом, ConfigurationClassParser создаст экземпляр AutoConfigurationImportSelector и вызовет его метод selectImports().
get
В методе selectImports используется метод getCandidateConfigurations(), когда вы проходите по этому методу, вы можете увидеть героя за автоматической конфигурацией: SpringFactoriesLoader
loader

Герой автоконфигурации: SpringFactoriesLoader

Основная функция SpramFactory загрузчика - начать с указанного файла конфигурацииMETA/spring.factoriesЧтобы загрузить конфигурацию, spring.factories представляет собой типичный файл свойств Java, а формат конфигурации имеет вид «ключ-значение», за исключением того, что и ключ, и значение являются полными именами классов типов Java.

Войдя в метод loadFactoryNames(), вы обнаружите, что loadFactoryNames() считывает файл META-INF/spring.factories в ClassPath.

load
В сценарии @EnableAutoConfiguration он обеспечивает дополнительную поддержку поиска конфигурации, то есть в соответствии с полным именем класса @EnableAutoConfiguration org.springframework.boot.autoconfigure.EnableAutoConfiguration в качестве ключа для поиска получить соответствующий набор классов @Configuration.
auto

4 метода в аннотации SpringBootApplication

@SpringBootApplication включает в себя не только три важные аннотации, но и 4 метода:

method

  • Class<?>[] exclude() default {};Чтобы исключить определенные классы до весеннего контейнера в соответствии с классом, входящие параметры являются типы классов
  • String[] excludeName() default {};Исключить определенные классы из добавления в контейнер Spring в соответствии с именем класса, а входящий параметр представляет собой массив строк полного имени класса класса.
  • String[] scanBasePackages() default {};Указывает пакет сканирования, параметр представляет собой строковый массив имен пакетов.
  • Class<?>[] scanBasePackageClasses() default {};Укажите пакет сканирования, параметр представляет собой массив типа Class

резюме

Вот краткое изложение характеристик трех важных аннотаций в @SpringBootApplication:

  • @Configuration

Определите класс конфигурации для контейнера Spring Ioc.

  • @EnableAutoConfiguration:

Найдите все файлы конфигурации META/spring.factories из пути к классам и поместите их вorg.springframework.boot.autoconfigure.EnableAutoConfigurationСоответствующий элемент конфигурации, т. е. список классов, загружаемых в Ioc-контейнер автоконфигурации. Проще говоря, то есть@EnawebleAutoConfigurationРазрешить Spring Boot автоматически настроить текущий проект в соответствии с зависимостями пакета jar в пути к классам.Например, добавление зависимостей spring-boot-starter-web автоматически добавит зависимости Tomcat и Spring MVC. Для всех классов конфигурации, отмеченных @Configuration, используйте один и тот жеConfigurationClassParserФ.

  • @ComponentScan

Автоматически сканировать и загружать подходящие компоненты или определения компонентов

использованная литература