• SpringBoot自动配置原理及启动流程


    一、自动配置

    • 主启动类

    1. //@SpringBootApplication 来标注一个主程序类
    2. //说明这是一个Spring Boot应用
    3. @SpringBootApplication
    4. public class SpringbootApplication {
    5. public static void main(String[] args) {
    6. //以为是启动了一个方法,没想到启动了一个服务
    7. SpringApplication.run(SpringbootApplication.class, args);
    8. }
    9. }

    • @SpringBootApplocation注解内部

    1. @SpringBootConfiguration
    2. @EnableAutoConfiguration
    3. @ComponentScan(
    4. excludeFilters = {@Filter(
    5. type = FilterType.CUSTOM,
    6. classes = {TypeExcludeFilter.class}
    7. ), @Filter(
    8. type = FilterType.CUSTOM,
    9. classes = {AutoConfigurationExcludeFilter.class}
    10. )}
    11. )
    12. public @interface SpringBootApplication {
    13. // ......
    14. }

    1.  @ComponentScan

    这个注解在Spring中很重要,它对应XML配置中的元素。

    作用:自动扫描并加载符合条件的组件或者bean,将这个bean定义加载到IOC容器中。

    2.  @SpringBootConfiguration

    作用:SpringBoot的配置类,标注在某个类上,表示这是一个SpringBoot的配置类;

    @Configuration 作用:允许在上下文中注册额外的bean或倒入其他配置类

    1. //@SpringBootConfiguration注解内部
    2. //这里的 @Configuration,说明这是一个配置类 ,配置类就是对应Spring的xml 配置文件;
    3. @Configuration
    4. public @interface SpringBootConfiguration {}
    5. //里面的 @Component 这就说明,启动类本身也是Spring中的一个组件而已,负责启动应用
    6. @Component
    7. public @interface Configuration {}

    3.  @EnableAutoConfigeration

    作用:启用SpringBoot的自动配置机制

     @AutoConfigurationPackage :自动配置包

    1. //AutoConfigurationPackage的子注解
    2. //Registrar.class 作用:将主启动类的所在包及包下面所有子包里面的所有组件扫描到Spring容器
    3. @Import({Registrar.class})
    4. public @interface AutoConfigurationPackage {
    5. }

    @EnableAutoConfigeration 注解通过Spring提供的 @Import 注解导入了 AutoConfigurationImportSelector 类; AutoConfigurationImportSelector 类中 getCandidateConfigurations 方法会将所有自动配置类的信息以List的形式返回,这些配置信息会被Spring容器作Bean来管理。

    1. protected List getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
    2. List configurations = SpringFactoriesLoader.loadFactoryNames(this.getSpringFactoriesLoaderFactoryClass(), this.getBeanClassLoader());
    3. 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.");
    4. return configurations;
    5. }

     4.  @Condition

            在Spring 4.0 增加的条件判断功能,通过这个可以功能可以实现选择性的创建 Bean 操作。

    • ConditionalOnProperty:判断配置文件中是否有对应属性和值才初始化Bean

    • ConditionalOnClass:判断环境中是否有对应字节码文件才初始化Bean

    • ConditionalOnMissingBean:判断环境中没有对应Bean才初始化Bean

    • ConditionalOnBean:判断环境中有对应Bean才初始化Bean

    以上注解在springBoot-autoconfigure的condition包下。

    • 总结原理

    1. @EnableAutoConfiguration 注解内部使用 @Import(AutoConfigurationImportSelector.class)来加载配置类;

    2. 配置文件位置:META-INF/spring.factories,该配置文件中定义了大量的配置类,当 SpringBoot 应用启动时,会自动加载这些配置类,初始化Bean;

    3. 并不是所有的Bean都会被初始化,在配置类中使用Condition来加载满足条件的Bean。

    二、启动流程

    1. 基于SpringBoot开发的项目中都会有一个@SpringBootApplication注解配置的启动类,启动类中会有一个main()方法作为启动入口,main()方法中调用SpringApplication.run(),开始启动整个SpringBoot应用程序;

    2. SpringApplication.run()方法中,首先进行初始化,创建SpringApplication对象,通过它的构造方法,完成初始化,读取自动配置核心类;

    3. 通过执行SpringApplication对象的run()方法,完成SpringBoot应用程序的启动逻辑:启动流程的监听、配置环境、打印启动Banner、创建Spring容器、记录启动时间、执行Runner(ApplicationRunner和CommandLineRunner)等启动步骤。

  • 相关阅读:
    详解C++代码从源代码到可执行文件的整个编译过程(预处理、编译、汇编和链接)
    LaunchView/启动页 的实现
    使用vue自定义实现Tree组件和拖拽功能
    安装Cmake&ffmpeg&libssh
    交换机IOS模式
    CN_数据链路层流量控制@可靠的传输机制@ARP协议
    C++类与对象二
    【数据结构--八大排序】之希尔排序
    EasyLazyload系列之实现图片懒加载
    [CISCN 2019初赛]Love Math
  • 原文地址:https://blog.csdn.net/weixin_52386948/article/details/127650662