文章目录

  • 一、什么是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的自动配置

spring boot自动化配置原理简述 简述springboot自动配置的原理_java

SpringBoot自动配置

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

术语"配置类"

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

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

1. 配置类的示例

spring boot自动化配置原理简述 简述springboot自动配置的原理_java_02

2. SpringBoot自动配置的实例

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

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

spring boot自动化配置原理简述 简述springboot自动配置的原理_spring_03


spring boot自动化配置原理简述 简述springboot自动配置的原理_SpringBoot自动配置_04


spring boot自动化配置原理简述 简述springboot自动配置的原理_java_05

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

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

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

spring boot自动化配置原理简述 简述springboot自动配置的原理_spring boot_06


spring boot自动化配置原理简述 简述springboot自动配置的原理_SpringBoot自动配置_07

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

spring boot自动化配置原理简述 简述springboot自动配置的原理_spring boot_08

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

spring boot自动化配置原理简述 简述springboot自动配置的原理_spring boot_09

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

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

spring boot自动化配置原理简述 简述springboot自动配置的原理_spring boot_10

三、注解@ComponentScan

spring boot自动化配置原理简述 简述springboot自动配置的原理_java_11

1. 注解@ComponentScan的示例

spring boot自动化配置原理简述 简述springboot自动配置的原理_spring boot_12

四、注解@Import

spring boot自动化配置原理简述 简述springboot自动配置的原理_java_13

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

1. 注解@Import导入普通类

spring boot自动化配置原理简述 简述springboot自动配置的原理_Java_14

(1)创建普通的Java类

spring boot自动化配置原理简述 简述springboot自动配置的原理_spring_15

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

spring boot自动化配置原理简述 简述springboot自动配置的原理_spring_16

(3)测试并运行

spring boot自动化配置原理简述 简述springboot自动配置的原理_java_17

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

spring boot自动化配置原理简述 简述springboot自动配置的原理_spring_18

(1)创建普通的Java类

spring boot自动化配置原理简述 简述springboot自动配置的原理_spring_19

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

spring boot自动化配置原理简述 简述springboot自动配置的原理_SpringBoot自动配置_20

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

spring boot自动化配置原理简述 简述springboot自动配置的原理_spring boot_21

(4)测试并运行

spring boot自动化配置原理简述 简述springboot自动配置的原理_spring_22

3. 导入接口ImportBeanDefinitionRegistrar的实现类

spring boot自动化配置原理简述 简述springboot自动配置的原理_SpringBoot自动配置_23

(1)创建普通的Java类

spring boot自动化配置原理简述 简述springboot自动配置的原理_spring boot_24

(2)创建ImportBeanDefinitionRegistrar的实现类

spring boot自动化配置原理简述 简述springboot自动配置的原理_java_25

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

spring boot自动化配置原理简述 简述springboot自动配置的原理_java_26

(4)测试并运行

spring boot自动化配置原理简述 简述springboot自动配置的原理_SpringBoot自动配置_27

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

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

spring boot自动化配置原理简述 简述springboot自动配置的原理_Java_28

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

spring boot自动化配置原理简述 简述springboot自动配置的原理_spring_29


spring boot自动化配置原理简述 简述springboot自动配置的原理_SpringBoot自动配置_30


spring boot自动化配置原理简述 简述springboot自动配置的原理_java_31


spring boot自动化配置原理简述 简述springboot自动配置的原理_spring boot_32

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

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

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

spring boot自动化配置原理简述 简述springboot自动配置的原理_SpringBoot自动配置_33

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

spring boot自动化配置原理简述 简述springboot自动配置的原理_spring_34

2. @SpringBootApplication结构图

spring boot自动化配置原理简述 简述springboot自动配置的原理_spring boot_35

3. 如何实现AutoConfigurationImportSelector

spring boot自动化配置原理简述 简述springboot自动配置的原理_java_36


spring boot自动化配置原理简述 简述springboot自动配置的原理_spring boot_37

4. SpringFactories机制

spring boot自动化配置原理简述 简述springboot自动配置的原理_Java_38


spring boot自动化配置原理简述 简述springboot自动配置的原理_java_39

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

spring boot自动化配置原理简述 简述springboot自动配置的原理_spring boot_40

6. 类AutoConfigurationImportSelector的关键源码

spring boot自动化配置原理简述 简述springboot自动配置的原理_SpringBoot自动配置_41

其中getAutoConfigurationEntry方法是自动配置的入口

spring boot自动化配置原理简述 简述springboot自动配置的原理_SpringBoot自动配置_42

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

spring boot自动化配置原理简述 简述springboot自动配置的原理_java_43

7. AutoConfigurationImportSelector的实现流程

spring boot自动化配置原理简述 简述springboot自动配置的原理_Java_44

8. 总结

spring boot自动化配置原理简述 简述springboot自动配置的原理_spring_45

七、注解@Conditional

spring boot自动化配置原理简述 简述springboot自动配置的原理_SpringBoot自动配置_46


spring boot自动化配置原理简述 简述springboot自动配置的原理_spring_47

八、SpringBoot自动配置实例-Redis

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

spring boot自动化配置原理简述 简述springboot自动配置的原理_java_48

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

spring boot自动化配置原理简述 简述springboot自动配置的原理_SpringBoot自动配置_49


spring boot自动化配置原理简述 简述springboot自动配置的原理_Java_50


spring boot自动化配置原理简述 简述springboot自动配置的原理_SpringBoot自动配置_51


spring boot自动化配置原理简述 简述springboot自动配置的原理_Java_52


spring boot自动化配置原理简述 简述springboot自动配置的原理_SpringBoot自动配置_53