SpringBoot自动化配置的实现机理 spring boot自动化配置 SpringBoot自动化配置源码分析

一、 @SpringBootApplication原理

@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan
public @interface SpringBootApplication {

1.1 @SpringBootConfiguration

  • 仅仅用于标注该类是一个配置类
@Configuration
public @interface SpringBootConfiguration {
}

1.2 @ComponentScan

  • 指定要扫描那些包,Spring注解

1.3 @EnableAutoConfiguriation(核心)

  • 源码
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {}

@AutoConfigurationPackage

  • 自动配置包,配置了包的默认规则
  • 源码
@Import(AutoConfigurationPackages.Registrar.class)  //给容器中导入一个组件
public @interface AutoConfigurationPackage {}

//导入了Registrar类,用于批量注册一系列组件
//将指定下包下的所有组件导入;
@Override
public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) {
	register(registry, new PackageImports(metadata).getPackageNames().toArray(new String[0]));
}

@Import(AutoConfigurationImportSelector.class)

1. 使用 getAutoConfigurationEntry(annotationMetadata) 方法,像容器当中批量导入一些组件
2. getCandidateConfigurations(annotationMetadata, attributes)获取需要导入组件的所有配置类
3. 使用SpringFactoriesLoader的loadSpringFactories()方法得到所有组件
    - 从哪得到?META-INF/spring.factories
    - 默认扫描我们系统当中所有spring.factories文件
    spring-boot-autoconfigure-2.3.4.RELEASE.jar
    文件里面写死了spring-boot一启动就要给容器中加载的所有配置类
spring-boot-autoconfigure-2.3.4.RELEASE.jar/META-INF/spring.factories

虽然在我们的Springboot启动时,大概有127个场景的自动配置类被默认加载(xxxAutoConfiguration),但是按照@Conditional,最终都会被按需加载!

二、自动配置流程

  • SpringBoot会优先加载自动配置类
  • 自动配置类生效后,一般都会绑定xxxProperties,来使用默认配置
  • 生效的自动化配置类,会往容器当中添加很++多组件++
  • 容器当中有了这些组件,相当于这些功能都有了。

2.1 定制化配置

  • 用户直接@Bean去添加组件
  • 组件获取的配置文件的值。
  • 自动化配置流程
graph TD
A(XXXAutoConfiguration)-->B[组件]
B-->c(xxxProperties)
c-->D(配置文件)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值