深入分析SpringBoot自动配置原理
创始人
2024-05-31 21:48:13
0

文章目录

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

在这里插入图片描述

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

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

相关内容

热门资讯

Python|位运算|数组|动... 目录 1、只出现一次的数字(位运算,数组) 示例 选项代...
张岱的人物生平 张岱的人物生平张岱(414年-484年),字景山,吴郡吴县(今江苏苏州)人。南朝齐大臣。祖父张敞,东...
西游西后传演员女人物 西游西后传演员女人物西游西后传演员女人物 孙悟空 六小龄童 唐僧 徐少华 ...
名人故事中贾岛作诗内容简介 名人故事中贾岛作诗内容简介有一次,贾岛骑驴闯了官道.他正琢磨着一句诗,名叫《题李凝幽居》全诗如下:闲...
和男朋友一起优秀的文案? 和男朋友一起优秀的文案?1.希望是惟一所有的人都共同享有的好处;一无所有的人,仍拥有希望。2.生活,...
戴玉手镯的好处 戴玉手镯好还是... 戴玉手镯的好处 戴玉手镯好还是碧玺好 女人戴玉?戴玉好还是碧玺好点佩戴手镯,以和田玉手镯为佳!相嫌滑...
依然什么意思? 依然什么意思?依然(汉语词语)依然,汉语词汇。拼音:yī    rán基本解释:副词,指照往常、依旧...
高尔基的散文诗 高尔基的散文诗《海燕》、《大学》、《母亲》、《童年》这些都是比较出名的一些代表作。
心在飞扬作者简介 心在飞扬作者简介心在飞扬作者简介如下。根据相关公开资料查询,心在飞扬是一位优秀的小说作者,他的小说作...
卡什坦卡的故事赏析? 卡什坦卡的故事赏析?讲了一只小狗的故事, 我也是近来才读到这篇小说. 作家对动物的拟人描写真是惟妙...
林绍涛为简艾拿绿豆糕是哪一集 林绍涛为简艾拿绿豆糕是哪一集第三十二集。 贾宽认为是阎帅间接导致刘映霞住了院,第二天上班,他按捺不...
小爱同学是女生吗小安同学什么意... 小爱同学是女生吗小安同学什么意思 小爱同学,小安同学说你是女生。小安是男的。
内分泌失调导致脸上长斑,怎么调... 内分泌失调导致脸上长斑,怎么调理内分泌失调导致脸上长斑,怎么调理先调理内分泌,去看中医吧,另外用好的...
《魔幻仙境》刺客,骑士人物属性... 《魔幻仙境》刺客,骑士人物属性加点魔幻仙境骑士2功1体质
很喜欢她,该怎么办? 很喜欢她,该怎么办?太冷静了!! 太理智了!爱情是需要冲劲的~不要考虑着考虑那~否则缘...
言情小说作家 言情小说作家我比较喜欢匪我思存的,很虐,很悲,还有梅子黄时雨,笙离,叶萱,还有安宁的《温暖的玄》 小...
两个以名人的名字命名的风景名胜... 两个以名人的名字命名的风景名胜?快太白楼,李白。尚志公园,赵尚志。
幼儿教育的代表人物及其著作 幼儿教育的代表人物及其著作卡尔威特的《卡尔威特的教育》,小卡尔威特,他儿子成了天才后写的《小卡尔威特...
海贼王中为什么说路飞打凯多靠霸... 海贼王中为什么说路飞打凯多靠霸气升级?凯多是靠霸气升级吗?因为之前刚到时确实打不过人家因为路飞的实力...
运气不好拜财神有用吗运气不好拜... 运气不好拜财神有用吗运气不好拜财神有没有用1、运气不好拜财神有用。2、拜财神上香前先点蜡烛,照亮人神...