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