предисловие
Класс запуска 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
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 см. в статье:Примечания к записи на весенние занятия
Герой автоконфигурации: SpringFactoriesLoader
Основная функция SpramFactory загрузчика - начать с указанного файла конфигурацииMETA/spring.factoriesЧтобы загрузить конфигурацию, spring.factories представляет собой типичный файл свойств Java, а формат конфигурации имеет вид «ключ-значение», за исключением того, что и ключ, и значение являются полными именами классов типов Java.
Войдя в метод loadFactoryNames(), вы обнаружите, что loadFactoryNames() считывает файл META-INF/spring.factories в ClassPath.
4 метода в аннотации SpringBootApplication
@SpringBootApplication включает в себя не только три важные аннотации, но и 4 метода:
-
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
Автоматически сканировать и загружать подходящие компоненты или определения компонентов