文章目录
一、什么是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文件,可以看到对应的依赖项