Spring Boot的配置和自动配置原理

SpringBoot的@SpringBootApplication注解整合了@Configuration,@EnableAutoConfiguration和@ComponentScan,用于启动应用并开启自动配置。@EnableAutoConfiguration通过加载META-INF/spring.factories中的配置类,根据依赖筛选并执行自动配置。核心在于AutoConfigurationImportSelector的处理过程,该过程涉及到了对配置类的加载和过滤。
摘要由CSDN通过智能技术生成

Spring Boot的配置和自动配置原理

@SpringBootApplication:

spring Boot应用标注在某个类上说明这个类是SpringBoot的主配置类,SpringBoot
需要运行这个类的main方法来启动SpringBoot应用

  • SpringBootApplication
@Target(ElementType.TYPE)
2 @Retention(RetentionPolicy.RUNTIME)
3 @Documented
4 @Inherited
5 @SpringBootConfiguration
6 @EnableAutoConfiguration
7 @ComponentScan(excludeFilters = {
8 @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
9 @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
10 public @interface SpringBootApplication {
  1. @Target(ElementType.TYPE) : 设置当前注解可以标记在哪
  2. @Retention(RetentionPolicy.RUNTIME) : 当注解标注的类编译以什么方式保留 RetentionPolicy.RUNTIME 会被jvm加载
  3. @Documented: java doc 会生成注解信息
  4. @Inherited: 是否会被继承
  5. @SpringBootConfiguration : Spring Boot的配置类; 标注在某个类上,表示这是一个Spring Boot的配置类;
  6. @Configuration : 配置类上来标注这个注解; 配置类 ----- 配置文件;配置类也是容器中的一个组件;
  7. @ComponentScan : 扫描包 相当于在spring.xml 配置中context:component-scan 但是并没有指定basepackage,如果没有指定spring底层会自动扫描当前配置类所在的包
  8. @EnableAutoConfiguration:开启自动配置功能; 以前我们需要配置的东西,Spring Boot帮我们自动配置;@EnableAutoConfiguration告诉SpringBoot开启自动配置,会帮我们自动去加载 自动配置类
  9. @ComponentScan : 扫描包 相当于在spring.xml 配置中context:component-scan 但是并没有指定basepackage,如果没有指定spring底层 会自动扫描当前配置类所在的包
    10.@ TypeExcludeFilter:springboot对外提供的扩展类, 可以供我们去按照我们的方式进行排除
  10. @ AutoConfigurationExcludeFilter:
    排除所有配置类并且是自动配置类中里面的其中一个 动配置功能;这样自动配置才能生效;.

这个注解里面,最主要的就是@EnableAutoConfiguration,这么直白的名字,一看就知道它要开启自动配置,于是默默进去@EnableAutoConfiguration的源码。

@Target(ElementType.TYPE)
2 @Retention(RetentionPolicy.RUNTIME)
3 @Documented
4 @Inherited
5 @AutoConfigurationPackage
6 @Import(AutoConfigurationImportSelector.class)
7 public @interface EnableAutoConfiguration {

通过注解@import导入了一个autoconfigurationImportSelector,而它实现了变种的DeferredImportSelector接口,通过里面的getImportGruop()方法返回的AutoConfigurationGroup.class
返回的类
判断是否实现了DeferredImportSelector.Group这个接口,实现了则调用关键方法,process()方法,里面调用了getAutoConfigurationEntry()方法
获取了所有有效的配置类,在getAutoConfigurationEntry()方法里调用了getCandidateConfiguation()方法
获取了所有配置类,getCandidateConfiguation()方法通过ImportCandidates.load读取jar包里面的META-INF/spring.factories读取到所有的配置类,然后通过this.getConfigurationClassFilter().filter()根据我们pom依赖中添加start过滤出有效配置类

流程图:

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

判断是否实现了DeferredImportSelector.Group这个接口,实现了则调用关键方法,process()方法
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
获取所有配置
在这里插入图片描述
读取jar包里面的META-INF/spring.factories读取到所有的配置类
在这里插入图片描述
根据我们pom依赖中添加start过滤出有效配置类,自此完成我们的自动装配
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值