Spring Boot 自动配置注解源码解析
前言
为什么Spring Boot
这么火?因为便捷,开箱即用,但是你思考过为什么会这么便捷吗?传统的SSM架构配置文件至少要写半天,而使用Spring Boot
之后只需要引入一个starter
之后就能直接使用,why???
原因很简单,每个starter
内部做了工作,比如Mybatis
的启动器默认内置了可用的SqlSessionFactory
。
至于如何内置的?Spring Boot
又是如何使其生效的?这篇文章就从源码角度介绍一下Spring Boot
的自动配置原理。
源码版本
作者Spring Boot
是基于2.4.0
。每个版本有些变化,读者尽量和我保持一致,以防源码有些出入。
@SpringBootApplication干了什么?
这么说吧,这个注解什么也没做,废物,活都交给属下做了,源码如下:

上方标注了三个重要的注解,如下:
@SpringBootConfiguration
:其实就是@Configuration
,因此主启动类可以当做配置类使用,比如注入Bean
等。@EnableAutoConfiguration
:这个注解牛批了,名字就不一样,开启自动配置,哦,关键都在这了.....@ComponentScan
:包扫描注解。
经过以上的分析,最终定位了一个注解@EnableAutoConfiguration
,顾名思义,肯定和自动配置有关,要重点分析下。
@EnableAutoConfiguration干了什么?
想要知道做了什么肯定需要看源码,如下:
上方标注了两个重要的注解,如下:
@AutoConfigurationPackage
:自动配置包注解,默认将主配置类(@SpringBootApplication
)所在的包及其子包里面的所有组件扫描到IOC容器
中。@Import
:该注解不必多说了,前面文章说过很多次了,这里是导入了AutoConfigurationImportSelector
,用来注入自动配置类。
以上只是简单的分析了两个注解,下面将会从源码详细的介绍一下。
@AutoConfigurationPackage
这个注解干了什么?这个需要看下源码,如下;
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Import(AutoConfigurationPackages.Registrar.class)
public @interface AutoConfigurationPackage {}
重要的还是@Import
注解,导入了AutoConfigurationPackages.Registrar
,这个类是干什么的?源码如下图:
其实就两个方法,但是的最重要的就是registerBeanDefinitions
方法,但是这个方法不用看,肯定是注入Bean
,这里的重点是注入哪些Bean
,重点源码如下:
//获取扫描的包
new PackageImports(metadata).getPackageNames().toArray(new String[0])
跟进代码,主要逻辑都在#PackageImports.PackageImports()
这个构造方法中,源码解析如下图:
从上面源码分析可以知道,这里扫描的包名是由两部分组成,分别如下:
- 从
@AutoConfigurationPackage
注解中的两个属性解析得来的包名。 - 注解
AutoConfigurationPackage
所在的包名,即是@SpringBootApplication
所在的包名。
@AutoConfigurationPackage
默认将主配置类(@SpringBootApplication
)所在的包及其子包里面的所有组件扫描到IOC容器中。
@Import(AutoConfigurationImportSelector.class)
这个注解不用多说了,最重要的就是AutoConfigurationImportSelector
,我们来看看它的继承关系,如下图:
这个类的继承关系还是挺简单的,实现了Spring
中的xxAware
注入一些必要的组件,但是最值得关心的是实现了一个DeferredImportSelector
这个接口,这个接口扩展了ImportSelector
,也改变了其运行的方式,这个在后面章节会介绍。
「注意」:这个类会导致一个误区,平时看到
xxxSelector
已经有了反射弧了,肯定会在selectImports()
方法上DEBUG
,但是这个类压根就没执行该方法,我第一次看也有点怀疑人生了,原来它走的是DeferredImportSelector
的接口方法。
其实该类真正实现逻辑的方法是process()
方法,但是主要加载自动配置类的任务交给了getAutoConfigurationEntry()
方法,具体的逻辑如下图:
上图的逻辑很简单,先从spring.factories
文件中获取自动配置类,在去掉@SpringBootApplication
中定义排除的自动配置类。
上图中的第④
步就是从META-INF/spring.factories
中加载自动配置类,代码很简单,在上一篇分析启动流程的时候也有很多组件是从spring.facotries
文件中加载的,代码都类似。
在springboot-autoconfigure
中的spring.facotries
文件内置了很多自动配置类,如下:
# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\
org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\
org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\
org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration,\
org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration,\
org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration,\
org.springframework.boot.autoconfigure.context.ConfigurationPropertiesAutoConfiguration,\
org.springframework.boot.autoconfigure.context.LifecycleAutoConfiguration,\
org.springframework.boot.autoconfigure.context.MessageSourceAutoConfiguration,\
org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration,\
................
了解了
Spring Boot
如何加载自动配置类,那么自定义一个自动配置类也是很简单了,后续章节教你如何定制自己的自动配置类,里面还是有很多门道的.....
Spring Boot 自动配置注解源码解析的更多相关文章
- SpringBoot自动配置的源码解析
首先,写源码分析真的很花时间,所以希望大家转的时候也请注明一下,Thanks♪(・ω・)ノ SpringBoot最大的好处就是对于很多框架都默认的配置,让我们开发的时候不必为了大一堆的配置文件头疼,关 ...
- SpringBoot 源码解析 (八)----- Spring Boot 精髓:事务源码解析
本篇来讲一下SpringBoot是怎么自动开启事务的,我们先来回顾一下以前SSM中是如何使用事务的 SSM使用事务 导入JDBC依赖包 众所周知,凡是需要跟数据库打交道的,基本上都要添加jdbc的依赖 ...
- Spring Boot 自动配置 源码分析
Spring Boot 最大的特点(亮点)就是自动配置 AutoConfiguration 下面,先说一下 @EnableAutoConfiguration ,然后再看源代码,到底自动配置是怎么配置的 ...
- Spring Boot 自动配置的原理、核心注解以及利用自动配置实现了自定义 Starter 组件
本章内容 自定义属性快速入门 外化配置 自动配置 自定义创建 Starter 组件 摘录:读书是读完这些文字还要好好用心去想想,写书也一样,做任何事也一样 图 2 第二章目录结构图 第 2 章 Spr ...
- Spring Boot自动配置与Spring 条件化配置
SpringBoot自动配置 SpringBoot的自动配置是一个运行时(应用程序启动时)的过程,简化开发时间,无需浪费时间讨论具体的Spring配置,只需考虑如何利用SpringBoot的自动配置即 ...
- Spring Boot 揭秘与实战 源码分析 - 工作原理剖析
文章目录 1. EnableAutoConfiguration 帮助我们做了什么 2. 配置参数类 – FreeMarkerProperties 3. 自动配置类 – FreeMarkerAutoCo ...
- Spring Boot 揭秘与实战 源码分析 - 开箱即用,内藏玄机
文章目录 1. 开箱即用,内藏玄机 2. 总结 3. 源代码 Spring Boot提供了很多”开箱即用“的依赖模块,那么,Spring Boot 如何巧妙的做到开箱即用,自动配置的呢? 开箱即用,内 ...
- Spring Boot自动配置原理(转)
第3章 Spring Boot自动配置原理 3.1 SpringBoot的核心组件模块 首先,我们来简单统计一下SpringBoot核心工程的源码java文件数量: 我们cd到spring-boot- ...
- Spring Boot自动配置SpringMVC(一)
实际上在关于Spring Boot自动配置原理实战的文章Spring Boot自动配置实战 - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)中,可以看到我们使用到了@ReqeusMappi ...
- Spring Boot 2.0系列文章(五):Spring Boot 2.0 项目源码结构预览
关注我 转载请务必注明原创地址为:http://www.54tianzhisheng.cn/2018/04/15/springboot2_code/ 项目结构 结构分析: Spring-boot-pr ...
随机推荐
- 【Android Studio】 SQLite 数据库 增删改查
今日目标:参照标题 实现效果: 实现过程: 1.创建实现页面 页面设计思路: 最外层垂直线性布局.内部使用三个线性布局.后两个用的水平排版,用来显示数值. 实例化四个Button,两个EditText ...
- 使用Python合并多个Excel文件
合并Excel可以将多个文件中的数据合并到一个文件中,这样可以帮助我们更好地汇总和管理数据.日常工作中,合并Excel主要有以下两种需求: 将多个Excel文件合并为一个文件 将多个Excel工作表合 ...
- 文档理解的新时代:LayOutLM模型的全方位解读
一.引言 在现代文档处理和信息提取领域,机器学习模型的作用日益凸显.特别是在自然语言处理(NLP)技术快速发展的背景下,如何让机器更加精准地理解和处理复杂文档成为了一个挑战.文档不仅包含文本信息,还包 ...
- MinIO客户端之mv
MinIO提供了一个命令行程序mc用于协助用户完成日常的维护.管理类工作. 官方资料 mc mv 将对象在桶之间移动. 在桶内准备好待移动的文件,检查对象,命令如下: ./mc ls local1/b ...
- Ubuntu系统部署后优化
Ubuntu系统配置调整 前期准备 #更改主机名,重启后不变 hostnamectl set-hostname Zabbix-Server01 #更改主机名,重启后变回从前 hostname Zabb ...
- libGDX游戏开发之字体样式(七)
libGDX游戏开发之字体样式(七) libGDX系列,游戏开发有unity3D巴拉巴拉的,为啥还用java开发?因为我是Java程序员emm-国内用libgdx比较少,多数情况需要去官网和googl ...
- 扩展中国剩余定理(Excrt)笔记
扩展中国剩余定理(excrt) 本来应该先学中国剩余定理的.但是有了扩展中国剩余定理,朴素的 CRT 就没用了. 扩展中国剩余定理用来求解如下形式的同余方程组: \[\begin{cases} x \ ...
- Golang实现JAVA虚拟机-解析class文件
原文链接:https://gaoyubo.cn/blogs/de1bedad.html 前言 所需前置知识为:JAVA语言.JVM知识.Go笔记 对应项目:jvmgo 一.准备环境 操作系统:Wind ...
- 文心一言 VS 讯飞星火 VS chatgpt (45)-- 算法导论6.1 3题
三.证明:在最大堆的任一子树中,该子树所包含的最大元素在该子树的根结点上. 文心一言: 在最大堆中,根结点是整个堆中最大元素的孩子,因此它包含的最大元素是在该子树的根结点上. 我们可以通过递归的方式证 ...
- 文心一言 VS 讯飞星火 VS chatgpt (40)-- 算法导论5.4 4题
四.一次聚会需要邀请多少人,才能让其中 3 人的生日很可能相同? 文心一言: 为了解决这个问题,我们需要先计算出所有可能的生日组合数,然后计算出其中生日相同的组合数. 已知需要邀请的人数为:23人 根 ...