SpringBoot自动配置与启动流程详细分析
作者:OlaiolaiO
这篇文章主要介绍了SpringBoot自动配置原理分析,SpringBoot是我们经常使用的框架,那么你能不能针对SpringBoot实现自动配置做一个详细的介绍。如果可以的话,能不能画一下实现自动配置的流程图。牵扯到哪些关键类,以及哪些关键点
一、自动配置
主启动类
//@SpringBootApplication 来标注一个主程序类 //说明这是一个Spring Boot应用 @SpringBootApplication public class SpringbootApplication { public static void main(String[] args) { //以为是启动了一个方法,没想到启动了一个服务 SpringApplication.run(SpringbootApplication.class, args); } }
@SpringBootApplocation注解内部
@SpringBootConfiguration @EnableAutoConfiguration @ComponentScan( excludeFilters = {@Filter( type = FilterType.CUSTOM, classes = {TypeExcludeFilter.class} ), @Filter( type = FilterType.CUSTOM, classes = {AutoConfigurationExcludeFilter.class} )} ) public @interface SpringBootApplication { // ...... }
1. @ComponentScan
这个注解在Spring中很重要,它对应XML配置中的元素。
作用:自动扫描并加载符合条件的组件或者bean,将这个bean定义加载到IOC容器中。
2. @SpringBootConfiguration
作用:SpringBoot的配置类,标注在某个类上,表示这是一个SpringBoot的配置类;
@Configuration 作用:允许在上下文中注册额外的bean或倒入其他配置类
//@SpringBootConfiguration注解内部 //这里的 @Configuration,说明这是一个配置类 ,配置类就是对应Spring的xml 配置文件; @Configuration public @interface SpringBootConfiguration {} //里面的 @Component 这就说明,启动类本身也是Spring中的一个组件而已,负责启动应用 @Component public @interface Configuration {}
3. @EnableAutoConfigeration
作用:启用SpringBoot的自动配置机制
import java.lang.annotation. Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Inherited; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import org.springframework.context.annotation.Import; @Target({ElementTypeTYPE}) @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 {}; }
@AutoConfigurationPackage :自动配置包
//AutoConfigurationPackage的子注解 //Registrar.class 作用:将主启动类的所在包及包下面所有子包里面的所有组件扫描到Spring容器 @Import({Registrar.class}) public @interface AutoConfigurationPackage { }
@EnableAutoConfigeration 注解通过Spring提供的 @Import 注解导入了 AutoConfigurationImportSelector 类; AutoConfigurationImportSelector 类中 getCandidateConfigurations 方法会将所有自动配置类的信息以List的形式返回,这些配置信息会被Spring容器作Bean来管理。
protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) { List<String> configurations = SpringFactoriesLoader.loadFactoryNames(this.getSpringFactoriesLoaderFactoryClass(), this.getBeanClassLoader()); Assert.notEmpty(configurations, "No auto configuration classes found in META-INF/spring.factories. If you are using a custom packaging, make sure that file is correct."); return configurations; }
4. @Condition
在Spring 4.0 增加的条件判断功能,通过这个可以功能可以实现选择性的创建 Bean 操作。
- ConditionalOnProperty:判断配置文件中是否有对应属性和值才初始化Bean
- ConditionalOnClass:判断环境中是否有对应字节码文件才初始化Bean
- ConditionalOnMissingBean:判断环境中没有对应Bean才初始化Bean
- ConditionalOnBean:判断环境中有对应Bean才初始化Bean
以上注解在springBoot-autoconfigure的condition包下。
总结原理
- @EnableAutoConfiguration 注解内部使用 @Import(AutoConfigurationImportSelector.class)来加载配置类;
- 配置文件位置:META-INF/spring.factories,该配置文件中定义了大量的配置类,当 SpringBoot 应用启动时,会自动加载这些配置类,初始化Bean;
- 并不是所有的Bean都会被初始化,在配置类中使用Condition来加载满足条件的Bean。
启动流程
- 基于SpringBoot开发的项目中都会有一个@SpringBootApplication注解配置的启动类,启动类中会有一个
main()
方法作为启动入口,main()
方法中调用SpringApplication.run()
,开始启动整个SpringBoot应用程序; - 在
SpringApplication.run()
方法中,首先进行初始化,创建SpringApplication对象,通过它的构造方法,完成初始化,读取自动配置核心类; - 通过执行SpringApplication对象的
run()
方法,完成SpringBoot应用程序的启动逻辑:启动流程的监听、配置环境、打印启动Banner、创建Spring容器、记录启动时间、执行Runner(ApplicationRunner和CommandLineRunner)等启动步骤。
到此这篇关于SpringBoot自动配置与启动流程详细分析的文章就介绍到这了,更多相关SpringBoot自动配置内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!