深入分析SpringBoot自动配置原理
创始人
2024-05-31 21:48:13
0

文章目录

  • 一、什么是SpringBoot的自动配置
    • 1. 配置类的示例
    • 2. SpringBoot自动配置的实例
  • 二、SpringBoot的启动流程(简化版)
    • 1. SpringBoot启动流程的简化版代码
    • 2. 主要分析一下以上启动流程中的第3步:加载并处理所有的配置类,processConfigurationClasses(..)
    • 3. 进一步分析处理配置类时的parse(..)方法
    • 4. 分析递归遍历配置类的过程
  • 三、注解@ComponentScan
    • 1. 注解@ComponentScan的示例
  • 四、注解@Import
    • 1. 注解@Import导入普通类
      • (1)创建普通的Java类
      • (2)创建一个配置类,直接将创建的普通类导入
      • (3)测试并运行
    • 2. 注解@Import导入接口ImportSelector实现类
      • (1)创建普通的Java类
      • (2)创建一个ImportSelector的实现类
      • (3)创建一个配置类,将ImportSelector的实现类导入
      • (4)测试并运行
    • 3. 导入接口ImportBeanDefinitionRegistrar的实现类
      • (1)创建普通的Java类
      • (2)创建ImportBeanDefinitionRegistrar的实现类
      • (3) 创建一个配置类,将ImportBeanDefinitionRegistrar的实现类导入
      • (4)测试并运行
  • 五、分析加载SpringBoot自动配置类的方式
  • 六、SpringBoot自动配置的原理剖析
    • 1. 一切都从注解@SpringBootApplication说起
    • 2. @SpringBootApplication结构图
    • 3. 如何实现AutoConfigurationImportSelector
    • 4. SpringFactories机制
    • 5. Java SPI机制与SpringFactories机制对比
    • 6. 类AutoConfigurationImportSelector的关键源码
    • 7. AutoConfigurationImportSelector的实现流程
    • 8. 总结
  • 七、注解@Conditional
  • 八、SpringBoot自动配置实例-Redis

一、什么是SpringBoot的自动配置

在这里插入图片描述

SpringBoot自动配置

  • 它是指基于你引入的依赖Jar包,对SpringBoot应用进行自动配置
  • 它为SpringBoot框架的“开箱即用”提供了基础支撑

术语"配置类"

  • 广义的“配置类”:被注解@Component直接或间接修饰的某个类,即我们常说的Spring组件,其中包括@Configuration类
  • 狭义的“配置类”:特指被注解@Configuration所修饰的某个类,又称为@Configuration类

如果没有特殊说明,我们说的配置类通常指的是广义的“配置类”

1. 配置类的示例

在这里插入图片描述

2. SpringBoot自动配置的实例

实例:Redis的自动配置
redis在SpringBoot中的使用步骤:

  1. 引入一个starter的依赖
  2. 配置Redis服务器的连接信息
  3. 直接使用RedisTemplate等Bean对象

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

通过以上步骤,SpringBoot就自动完成了Redis的配置,将相关的Bean对象注册到IOC容器中了

二、SpringBoot的启动流程(简化版)

1. SpringBoot启动流程的简化版代码

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

2. 主要分析一下以上启动流程中的第3步:加载并处理所有的配置类,processConfigurationClasses(…)

在这里插入图片描述

3. 进一步分析处理配置类时的parse(…)方法

在这里插入图片描述

4. 分析递归遍历配置类的过程

从原配置类出发,通过注解@ComponentScan和@Import不断去遍历新的配置类,直到没有新的配置类被发现为止。通过递归遍历后,得到一系列配置类,再对每个配置类进行解析处理,并将得到的BeanDefinition注册到IOC容器中

在这里插入图片描述

三、注解@ComponentScan

在这里插入图片描述

1. 注解@ComponentScan的示例

在这里插入图片描述

四、注解@Import

这个“其他地方”通常指的是第三方Jar包

1. 注解@Import导入普通类

在这里插入图片描述

(1)创建普通的Java类

在这里插入图片描述

(2)创建一个配置类,直接将创建的普通类导入

在这里插入图片描述

(3)测试并运行

在这里插入图片描述

2. 注解@Import导入接口ImportSelector实现类

在这里插入图片描述

(1)创建普通的Java类

在这里插入图片描述

(2)创建一个ImportSelector的实现类

在这里插入图片描述

(3)创建一个配置类,将ImportSelector的实现类导入

在这里插入图片描述

(4)测试并运行

在这里插入图片描述

3. 导入接口ImportBeanDefinitionRegistrar的实现类

在这里插入图片描述

(1)创建普通的Java类

在这里插入图片描述

(2)创建ImportBeanDefinitionRegistrar的实现类

在这里插入图片描述

(3) 创建一个配置类,将ImportBeanDefinitionRegistrar的实现类导入

在这里插入图片描述

(4)测试并运行

在这里插入图片描述

五、分析加载SpringBoot自动配置类的方式

SpringBoot加载配置类的方式有以下几种

在这里插入图片描述

但是加载SpringBoot的自动配置类需要选择一种合适的方式

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

结论:SpringBoot使用注解@Import导入一个ImportSelector从而实现了自动配置的功能

六、SpringBoot自动配置的原理剖析

1. 一切都从注解@SpringBootApplication说起

在这里插入图片描述

@SpringBootApplication源码:
@SpringBootApplication元注解中包括了@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan
其中注解@EnableAutoConfiguration的含义是,开启了自动配置的功能

在这里插入图片描述

2. @SpringBootApplication结构图

在这里插入图片描述

3. 如何实现AutoConfigurationImportSelector

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

4. SpringFactories机制

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

5. Java SPI机制与SpringFactories机制对比

在这里插入图片描述

6. 类AutoConfigurationImportSelector的关键源码

在这里插入图片描述

其中getAutoConfigurationEntry方法是自动配置的入口
在这里插入图片描述

着重看下getCandidateConfigurations方法,这是基于SpringFactories机制来获取第三方Jar包中所有自动配置类的方法。
注意:从配置文件获取自动配置类时,使用的key是类EnableAutoConfiguration的全限定名

在这里插入图片描述

7. AutoConfigurationImportSelector的实现流程

在这里插入图片描述

8. 总结

在这里插入图片描述

七、注解@Conditional

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

八、SpringBoot自动配置实例-Redis

以spring-boot-starter-data-redis为例:

在这里插入图片描述

查看对应的pom.xml文件,可以看到对应的依赖项

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

相关内容

热门资讯

中证A500ETF摩根(560... 8月22日,截止午间收盘,中证A500ETF摩根(560530)涨1.19%,报1.106元,成交额...
A500ETF易方达(1593... 8月22日,截止午间收盘,A500ETF易方达(159361)涨1.28%,报1.104元,成交额1...
何小鹏斥资约2.5亿港元增持小... 每经记者|孙磊    每经编辑|裴健如 8月21日晚间,小鹏汽车发布公告称,公司联...
中证500ETF基金(1593... 8月22日,截止午间收盘,中证500ETF基金(159337)涨0.94%,报1.509元,成交额2...
中证A500ETF华安(159... 8月22日,截止午间收盘,中证A500ETF华安(159359)涨1.15%,报1.139元,成交额...
科创AIETF(588790)... 8月22日,截止午间收盘,科创AIETF(588790)涨4.83%,报0.760元,成交额6.98...
创业板50ETF嘉实(1593... 8月22日,截止午间收盘,创业板50ETF嘉实(159373)涨2.61%,报1.296元,成交额1...
港股异动丨航空股大幅走低 中国... 港股航空股大幅下跌,其中,中国国航跌近7%表现最弱,中国东方航空跌近5%,中国南方航空跌超3%,美兰...
电网设备ETF(159326)... 8月22日,截止午间收盘,电网设备ETF(159326)跌0.25%,报1.198元,成交额409....
红利ETF国企(530880)... 8月22日,截止午间收盘,红利ETF国企(530880)跌0.67%,报1.034元,成交额29.0...