文章目录
- 一、什么是SpringBoot的自动配置
- 1. 配置类的示例
- 2. SpringBoot自动配置的实例
- 二、SpringBoot的启动流程(简化版)
- 1. SpringBoot启动流程的简化版代码
- 2. 主要分析一下以上启动流程中的第3步:加载并处理所有的配置类,processConfigurationClasses(..)
- 3. 进一步分析处理配置类时的parse(..)方法
- 4. 分析递归遍历配置类的过程
- 三、注解@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中的使用步骤:
- 引入一个starter的依赖
- 配置Redis服务器的连接信息
- 直接使用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文件,可以看到对应的依赖项




