Bootstrap

深入分析SpringBoot自动配置原理

文章目录

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

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

;