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

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

相关内容

热门资讯

多城联动!辽宁消防“安全盛宴”...   5月8日,辽宁省消防救援总队以创意形式和贴心服务,在鞍山、抚顺、丹东、锦州、营口等地同步开展多元...
大美江湖,天下岳阳   千年巴陵,江湖旧梦;一座岳阳,四水归心。  当千年岳阳楼的飞檐在XR空间里再度挑起月色,当洞庭湖...
王帅红在全市开发区工作推进会上... 5月9日,全市开发区工作推进会召开。会议深入学习贯彻习近平总书记关于开发区工作的重要指示精神,认真贯...
林志玲深夜晒合照回忆与大S首次... 5月10日晚,林志玲晒合照,怀念第一次见到大S:第一次见到大S,是在一个冰淇淋店。当时还没有入行的我...
boc某行刚涨薪了? (转自:五道口江湖)近日,有多名山东、河北、河南地区boc行的网友分享,上个月涨薪了。其中山东地区的...
CPI环比由降转涨 部分工业行... 转自:衢州日报  4月份,全国居民消费价格指数(CPI)环比由上月下降0.4%转为上涨0.1%,扣除...
应急处置演练 转自:衢州日报  近日,柯城区衢化街道组织开展防汛防台应急处置演练。此次演练包括桌面推演和卫星电话、...
胡忠雄主持召开贵安新区党工委巡... 5月10日,省委常委、贵安新区党工委书记胡忠雄主持召开新区党工委巡视整改工作领导小组会议。他强调,要...
“夜游信安湖”入选省级精品航线 转自:衢州日报  本报讯 (通讯员 吴丽芬 戴晨涛) 近日,全省水路交旅融合品牌——“泛舟浙里”发布...
中原建业:1-4月合约销售35... 业绩快报5月9日,中原建业有限公司(股票代码:09982.HK,以下简称“中原建业”)发布2025年...
新华社评论员:守护历史记忆,共... 转自:北京日报客户端当地时间5月9日,俄罗斯莫斯科红场碧空澄澈、旗帜招展,纪念苏联伟大卫国战争胜利8...
2025年前4个月,我国货物贸... 海关总署日前发布数据显示,2025年前4个月,以人民币计,我国货物贸易进出口总值14.14万亿元,同...
南京鼓楼城管上门服务指导湖南路... 转自:扬子晚报扬子晚报网5月10日讯(通讯员 李亦军 记者 张可)近期,南京鼓楼城管大队湖管会中队联...
多出去玩能减少身体炎症 多接触大自然的人更健康与城市相比,自然环境中的景色、气味、声音更能促进身心健康。发表于美国《大脑行为...
头部投行美女转行瑜伽! (转自:五道口江湖)一名香港普拉提老师说:一年前的差不多这个時候我交还了Morgan Stanley...
中自科技携手天津大学、王成山院... 5月8日,在成都举办的“青城论道低碳能源共生发展”大会上,中自科技股份有限公司与天津大学、中国工程院...
鲁慕迅逝世,享年98岁 湖北省文联鲁慕迅同志治丧小组5月9日发布讣告,湖北省文联离休干部、省美术家协会原副主席、一级美术师鲁...
听·见|“被名言”借助网络泛滥... ——莫言说:“我不够成熟,不够圆滑,不够老练。没关系,我只不过是一个晚熟的人。”原来莫爷爷是我的同类...
曝光AL保险资管公司领导 (转自:五道口江湖)近日网传的一份文件,吐槽AL保险资管公司领导,对实习生不尊重,缺乏专业能力,人际...
成都蓉城客场4-0横扫梅州客家... 封面新闻记者 陈羽啸北京时间5月10日晚,2025赛季中超联赛第12轮在五华奥体中心展开争夺,成都蓉...