文章目录
- 一、什么是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的自动配置
![在这里插入图片描述](https://img.pic99.top/cnyincai/202405/bab4d4165ed547b.png)
SpringBoot自动配置
- 它是指基于你引入的依赖Jar包,对SpringBoot应用进行自动配置
- 它为SpringBoot框架的“开箱即用”提供了基础支撑
术语"配置类"
- 广义的“配置类”:被注解@Component直接或间接修饰的某个类,即我们常说的Spring组件,其中包括@Configuration类
- 狭义的“配置类”:特指被注解@Configuration所修饰的某个类,又称为@Configuration类
如果没有特殊说明,我们说的配置类通常指的是广义的“配置类”
1. 配置类的示例
![在这里插入图片描述](https://img.pic99.top/cnyincai/202405/28a49c9adab0b06.png)
2. SpringBoot自动配置的实例
实例:Redis的自动配置
redis在SpringBoot中的使用步骤:
- 引入一个starter的依赖
- 配置Redis服务器的连接信息
- 直接使用RedisTemplate等Bean对象
![在这里插入图片描述](https://img.pic99.top/cnyincai/202405/5d10c406e27aceb.png)
![在这里插入图片描述](https://img.pic99.top/cnyincai/202405/8b9896f3caf80fe.png)
![在这里插入图片描述](https://img.pic99.top/cnyincai/202405/8715fb9a6faa32b.png)
通过以上步骤,SpringBoot就自动完成了Redis的配置,将相关的Bean对象注册到IOC容器中了
二、SpringBoot的启动流程(简化版)
1. SpringBoot启动流程的简化版代码
![在这里插入图片描述](https://img.pic99.top/cnyincai/202405/6bd17260a9dc0de.png)
![在这里插入图片描述](https://img.pic99.top/cnyincai/202405/e5402ad23471d4d.png)
2. 主要分析一下以上启动流程中的第3步:加载并处理所有的配置类,processConfigurationClasses(…)
![在这里插入图片描述](https://img.pic99.top/cnyincai/202405/b75c28754a86f70.png)
3. 进一步分析处理配置类时的parse(…)方法
![在这里插入图片描述](https://img.pic99.top/cnyincai/202405/1c17036ee1f5d96.png)
4. 分析递归遍历配置类的过程
从原配置类出发,通过注解@ComponentScan和@Import不断去遍历新的配置类,直到没有新的配置类被发现为止。通过递归遍历后,得到一系列配置类,再对每个配置类进行解析处理,并将得到的BeanDefinition注册到IOC容器中
![在这里插入图片描述](https://img.pic99.top/cnyincai/202405/16ec31ea3b0a129.png)
三、注解@ComponentScan
![在这里插入图片描述](https://img.pic99.top/cnyincai/202405/b3ef45f5f06c2dd.png)
1. 注解@ComponentScan的示例
![在这里插入图片描述](https://img.pic99.top/cnyincai/202405/dab650766ae2f4b.png)
四、注解@Import
![](https://img.pic99.top/cnyincai/202405/2990c401801adbe.png)
这个“其他地方”通常指的是第三方Jar包
1. 注解@Import导入普通类
![在这里插入图片描述](https://img.pic99.top/cnyincai/202405/3f698caedb34f8d.png)
(1)创建普通的Java类
![在这里插入图片描述](https://img.pic99.top/cnyincai/202405/d1cbf4cc1ae3d03.png)
(2)创建一个配置类,直接将创建的普通类导入
![在这里插入图片描述](https://img.pic99.top/cnyincai/202405/e8afd39d77068ec.png)
(3)测试并运行
![在这里插入图片描述](https://img.pic99.top/cnyincai/202405/370cc9cdbec3.png)
2. 注解@Import导入接口ImportSelector实现类
![在这里插入图片描述](https://img.pic99.top/cnyincai/202405/0617fea4a04b744.png)
(1)创建普通的Java类
![在这里插入图片描述](https://img.pic99.top/cnyincai/202405/ac6f38431ad7c05.png)
(2)创建一个ImportSelector的实现类
![在这里插入图片描述](https://img.pic99.top/cnyincai/202405/a28d3f5f7435296.png)
(3)创建一个配置类,将ImportSelector的实现类导入
![在这里插入图片描述](https://img.pic99.top/cnyincai/202405/bc401e8cff951ac.png)
(4)测试并运行
![在这里插入图片描述](https://img.pic99.top/cnyincai/202405/087b5c9fc145cfc.png)
3. 导入接口ImportBeanDefinitionRegistrar的实现类
![在这里插入图片描述](https://img.pic99.top/cnyincai/202405/3889a78e2741c17.png)
(1)创建普通的Java类
![在这里插入图片描述](https://img.pic99.top/cnyincai/202405/0706f3586577913.png)
(2)创建ImportBeanDefinitionRegistrar的实现类
![在这里插入图片描述](https://img.pic99.top/cnyincai/202405/a9c51550b8e7da.png)
(3) 创建一个配置类,将ImportBeanDefinitionRegistrar的实现类导入
![在这里插入图片描述](https://img.pic99.top/cnyincai/202405/1ab87ffbf09a37b.png)
(4)测试并运行
![在这里插入图片描述](https://img.pic99.top/cnyincai/202405/1eb2ff2c4be63d1.png)
五、分析加载SpringBoot自动配置类的方式
SpringBoot加载配置类的方式有以下几种
![在这里插入图片描述](https://img.pic99.top/cnyincai/202405/00276fc8c2e3c4c.png)
但是加载SpringBoot的自动配置类需要选择一种合适的方式
![在这里插入图片描述](https://img.pic99.top/cnyincai/202405/994608dbba7f8ce.png)
![在这里插入图片描述](https://img.pic99.top/cnyincai/202405/bb96e6b6247a4b7.png)
![在这里插入图片描述](https://img.pic99.top/cnyincai/202405/68517f4b8209378.png)
![在这里插入图片描述](https://img.pic99.top/cnyincai/202405/709ccbbd1d1b77c.png)
结论:SpringBoot使用注解@Import导入一个ImportSelector从而实现了自动配置的功能
六、SpringBoot自动配置的原理剖析
1. 一切都从注解@SpringBootApplication说起
![在这里插入图片描述](https://img.pic99.top/cnyincai/202405/cd7d847a262ef3d.png)
@SpringBootApplication源码:
@SpringBootApplication元注解中包括了@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan
其中注解@EnableAutoConfiguration的含义是,开启了自动配置的功能
![在这里插入图片描述](https://img.pic99.top/cnyincai/202405/753bd3e55288f17.png)
2. @SpringBootApplication结构图
![在这里插入图片描述](https://img.pic99.top/cnyincai/202405/7d9b5b34652ed71.png)
3. 如何实现AutoConfigurationImportSelector
![在这里插入图片描述](https://img.pic99.top/cnyincai/202405/9200826b9e23d7c.png)
![在这里插入图片描述](https://img.pic99.top/cnyincai/202405/543afb3af791f14.png)
4. SpringFactories机制
![在这里插入图片描述](https://img.pic99.top/cnyincai/202405/231df2ca7645.png)
![在这里插入图片描述](https://img.pic99.top/cnyincai/202405/5d41f4db15fe027.png)
5. Java SPI机制与SpringFactories机制对比
![在这里插入图片描述](https://img.pic99.top/cnyincai/202405/1ff5b7bcd038fd7.png)
6. 类AutoConfigurationImportSelector的关键源码
![在这里插入图片描述](https://img.pic99.top/cnyincai/202405/ed0afc748916a13.png)
其中getAutoConfigurationEntry方法是自动配置的入口
![在这里插入图片描述](https://img.pic99.top/cnyincai/202405/ae8e5503bbb0630.png)
着重看下getCandidateConfigurations方法,这是基于SpringFactories机制来获取第三方Jar包中所有自动配置类的方法。
注意:从配置文件获取自动配置类时,使用的key是类EnableAutoConfiguration的全限定名
![在这里插入图片描述](https://img.pic99.top/cnyincai/202405/add5632d85d231a.png)
7. AutoConfigurationImportSelector的实现流程
![在这里插入图片描述](https://img.pic99.top/cnyincai/202405/9a1ea0b4c41b.png)
8. 总结
![在这里插入图片描述](https://img.pic99.top/cnyincai/202405/ffee847f773a518.png)
七、注解@Conditional
![在这里插入图片描述](https://img.pic99.top/cnyincai/202405/42bf8510c997d84.png)
![在这里插入图片描述](https://img.pic99.top/cnyincai/202405/5e4b83e9f205269.png)
八、SpringBoot自动配置实例-Redis
以spring-boot-starter-data-redis为例:
![在这里插入图片描述](https://img.pic99.top/cnyincai/202405/5948a9b94c01624.png)
查看对应的pom.xml文件,可以看到对应的依赖项
![在这里插入图片描述](https://img.pic99.top/cnyincai/202405/ffeaa881f01ae5c.png)
![在这里插入图片描述](https://img.pic99.top/cnyincai/202405/2d7a13f6d2b5b95.png)
![在这里插入图片描述](https://img.pic99.top/cnyincai/202405/4996b9cdf487f37.png)
![在这里插入图片描述](https://img.pic99.top/cnyincai/202405/8bfe38da65010d5.png)
![在这里插入图片描述](https://img.pic99.top/cnyincai/202405/043fa44c144b1d1.png)