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

自动装配原理 @SpringBootApplication

pom.xml

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

启动器

<!--启动器-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
</dependency>

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

主程序

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

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

在这里插入图片描述

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

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

在这里插入图片描述


首先来看 @SpringBootConfiguration springboot配置注解

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

在这里插入图片描述

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

在这里插入图片描述


再看 @EnableAutoConfiguration 自动配置注解

在这里插入图片描述

发现自动配置包注解 @AutoConfigurationPackage

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

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

在这里插入图片描述

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

里面定义了环境、类加载器、资源加载器等等
在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

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

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

而springboot的主启动类@SpringBootApplication

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

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

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

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

在这里插入图片描述

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

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

在这里插入图片描述

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

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

猜你喜欢

转载自blog.csdn.net/Aurinko324/article/details/125353992