学习博客:【SpringBoot】@SpringBootApplication自动装配原理

自动装配原理 @SpringBootApplication

pom.xml

  • spring-boot-dependencies 核心依赖 (父工程)
  • 引入springboot依赖时无需指定版本 (仓库)

启动器


<dependency>
    <groupId>org.springframework.bootgroupId>
    <artifactId>spring-boot-starterartifactId>
dependency>

springboot 所有的功能场景 ==> 对应的启动器

主程序

@SpringBootApplication  //标注 springboot应用   启动类下的所有资源被导入
public class Springboot01HelloworldApplication {

    public static void main(String[] args) {
        //通过反射加载该类的对象
        SpringApplication.run(Springboot01HelloworldApplication.class, args);
    }
}

学习博客:【SpringBoot】@SpringBootApplication自动装配原理_第1张图片

点进去看,发现两个核心注解

@SpringBootConfiguration springboot配置注解
@EnableAutoConfiguration 自动配置注解

学习博客:【SpringBoot】@SpringBootApplication自动装配原理_第2张图片


首先来看 @SpringBootConfiguration springboot配置注解

点进去发现 @Configuration 这是一个配置类

学习博客:【SpringBoot】@SpringBootApplication自动装配原理_第3张图片

再点进去 @Component 这其实是一个spring组件

学习博客:【SpringBoot】@SpringBootApplication自动装配原理_第4张图片


再看 @EnableAutoConfiguration 自动配置注解

学习博客:【SpringBoot】@SpringBootApplication自动装配原理_第5张图片

发现自动配置包注解 @AutoConfigurationPackage

自动配置选择器 @Import({AutoConfigurationImportSelector.class})

点开自动配置包注解 @AutoConfigurationPackage发现导入了一个注册器 @Import({Registrar.class})

学习博客:【SpringBoot】@SpringBootApplication自动装配原理_第6张图片

再点开自动配置选择器 @Import({AutoConfigurationImportSelector.class}) 这是核心

里面定义了环境、类加载器、资源加载器等等
学习博客:【SpringBoot】@SpringBootApplication自动装配原理_第7张图片

重点在于 (自动加载配置器实体)getAutoConfigurationEntry()这个方法

学习博客:【SpringBoot】@SpringBootApplication自动装配原理_第8张图片

发现(获取候选配置)getCandidateConfigurations()这个方法,追进去

学习博客:【SpringBoot】@SpringBootApplication自动装配原理_第9张图片

这个方法获取了所有加载的配置方法SpringFactoriesLoader.loadFactoryNames(),加载了两个方法,重点看(获取spring工厂加载工厂类)getSpringFactoriesLoaderFactoryClass()这个方法,发现它获取了自动配置注解@EnableAutoConfiguration的类

protected Class<?> getSpringFactoriesLoaderFactoryClass() {
   return EnableAutoConfiguration.class;
}

而springboot的主启动类@SpringBootApplication

继承了这个自动配置注解@EnableAutoConfiguration

学习博客:【SpringBoot】@SpringBootApplication自动装配原理_第10张图片

绕了这么大一圈,它做了一件事情,就是导入启动类下所有资源,此外

学习博客:【SpringBoot】@SpringBootApplication自动装配原理_第11张图片

如果配置不为空,就会去 (自动配置的核心文件)META-INF/spring.factories 寻找配置文件

学习博客:【SpringBoot】@SpringBootApplication自动装配原理_第12张图片

but 2.7版本的springboot自动配置文件在

META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports

学习博客:【SpringBoot】@SpringBootApplication自动装配原理_第13张图片

but spring.factories仍然可以使用,后续可能会废除

现在看下它是怎么加载配置文件的 追进 SpringFactoriesLoader.loadFactoryNames

学习博客:【SpringBoot】@SpringBootApplication自动装配原理_第14张图片

这个方法就是从核心配置文件 META-INF/spring.factories 或系统文件中循环获取该配置文件中的所有配置,遍历出来封装成properties以供使用

注意:springboot所有自动配置都在启动时扫描并加载,spring.factories所有的自动配置类都在里面,只有导入对应的启动器,满足条件(@ConditionalOnXXX),自动配置才会生效。

你可能感兴趣的:(SpringBoot,spring,boot,学习,java)