当前位置: 首页 > news >正文 SpringBoot原理-04.自动配置-原理分析-源码跟踪 news 来源:原创 2025/6/20 23:08:44 一.原理分析 我们对springboot项目进行原理分析,就要从springboot的启动类入手。在启动类上有一个注解@SpringBootApplication,这个注解是我们进行原理分析和源码跟踪的关键。我们进入看看。该注解也是Springboot框架中最重要的注解。 进入SpringBootApplication注解中,我们可以看到如下: 这些注解中只有一个注解的功能我们还不清楚,就是@EnableAutoConfiguration,看来这个注解就是实现自动配置的关键注解。 下面我们就来研究这个注解。 二. @EnableAutoConfiguration 上一小节中我们提到,@EnableAutoConfiguration这个注解以及以enable打头的注解当中封装了一个注解,就是@Import注解。通过@Import来导入指定的bean或者配置类。我们进入到@EnableAutoConfiguration这个注解当中,发现果然有一个 @Import注解。@Import注解当中封装的是一个AutoConfigurationImportSelector类。而 ImportSelector是一个接口,AutoConfigurationImportSelector类其实就是 ImportSelector这个接口的实现类,下面我们就来找这个ImportSelector接口。 接下来我们进入到AutoConfigurationImportSelector这个实现类当中。当前类实现了DeferredImportSelector这个接口。 我们再进入DeferredImportSelector,这个接口又继承了ImportSelect这个接口。 在ImportSelect这个接口中有一个非常重要的接口方法selectImports,这个方法的返回值String类型的数组中封装的是哪些类我们需要导入到IOC容器当中。里面封装的就是这些类的全类名。 下面我们就要找到ImportSelector这个接口的实现类,也就是AutoConfigurationImportSelector这个类中的selectImports这个方法,我们就重点关注selectImports这个方法的返回值。该返回值是一个String类型的数组,使用StringUtils这个工具类的toStringArray方法返回,该方法传递了一个autoConfigurationEntry对象,该对象调用getConfigurations()方法。 autoConfigurationEntry对象是调用getAutoConfigurationEntry这个方法获取到的,因此下面的关键就是查看getAutoConfigurationEntry这个方法。 这个方法的返回值是一个AutoConfigurationEntry对象,里面传递两个参数,一个是configurations,一个是exclusions。 通过上面的selectImports方法可以知道最终它调用了getConfigurations()这个方法,因此关键点就在于这个configurations参数。我们可以看到configurations这个List集合是通过getCandidateConfigurations这个方法获得的。我们查看该方法。 在该方法中我们在生成configurations这个List集合的时候调用了这么一个方法loadFactoryNames,在下面有一个断言,用来判断configurations这个集合是否是空的。如果是空的就会报下面的信息:没有META-INF/spring.factories或META-INF/spring/org......这两个自动配置的类被发现。 也就是说在spring项目执行的时候会自动加载这两个文件中所配置的信息,把这两个文件中配置的信息加载出来后封装到list集合中,最终list集合中的内容再封装到String[]类型的数组中。String[]类型的数组中存储的就是要加载到IOC容器中的bean或者配置类。 现在的关键点就是要找到这两份文件。 3.自动配置文件 这两份文件在我们引入的起步以来当中基本上都有。spring-boot-autoconfigure这个这个依赖就是自动配置的依赖,在这个jar包当中就会有这类文件。 mybatis依赖jar包中也有 那么我们就找到这些jar包,看看里面都配置了什么信息。我们找到library 点击在这里面,找到spring.factories文件。里面配置了很多信息。 这些信息就是这些要自动配置的类的全类名。 以及第二个文件org.springframework.boot.autoconfigure.AutoConfiguration.imports,里面配置的都是全类名。这些文件中的内容会被读取出来最总加载到IOC容器中成为IOC容器中的bean对象。这些类都是自动配置类。 之前我们使用的Gson对象,虽然我们没有配置但是可以直接使用,原因就是进行了自动配置。我们可以找打Gson这个自动配置类,查看他的源码。 源码中上面有一个注解@AutoConfiguration,底层就封装了一个注解@Configuration,那就说明当前类是一个配置类。 之所以能够完成自动配置,就是因为里面定义了一个gson方法,且返回值就是Gson类型的数据,上面定义了一个@Bean注解。因此才可以直接使用@Autowired注入该bean对象直接使用。 4.总结 @SpringBootApplication注解中封装了三个关键注解@SpringBootConfiguration,@ComponentScan,@EnableAutoConfiguration。而在@EnableAutoConfiguration底层封装了一个@Import注解。传入的是ImportSelector接口的实现类,这个接口中的方法selectImports()方法,导入了两个文件,这两个文件中指定了,要自动配置的类的全类名。 注:spring.factories配置文件已被移除。 以上就是spring实现自动配置的原理。 相关文章: SEKI —— 基于大型语言模型的自进化与知识启发式神经架构搜索 蓝桥杯备赛Day12 动态规划1基础 UDP透传程序 数据结构:哈希表 Django 项目模块化开发指南:实现 Vue 风格的组件化 基础工具常用api汇总(机器学习) modbus 协议的学习,谢谢老师 字节跳动系统攻防算法岗-Flow安全内推 从“搜索”到“对话”:AI帮助中心如何重塑用户体验? 如何配置虚拟机IP? MyBatis-Plus 逻辑删除实现 leetcode 240. 搜索二维矩阵 II 关于虚拟环境中遇到的bug SFT与RLHF的关系 QT5 GPU使用 白帽子讲Web安全资源下载 JS禁止web页面调试 ⭐算法OJ⭐字符串与数组【动态规划 DP】(C++实现)最长公共子序列 LCS + 最短公共超序列 SCS 洛谷 P11830 省选联考2025 幸运数字 题解 【编程题】7-3 树的同构 网站建设工期/网页推广平台 广告公司网站开发/网站优化要做哪些 制作音乐网站实验报告/google play官网 厦门建网站多少钱/河南最近的热搜事件 网站建设网站模板/互联网营销师课程 浙江省建设职业注册中心网站/网络培训心得体会5篇
一.原理分析 我们对springboot项目进行原理分析,就要从springboot的启动类入手。在启动类上有一个注解@SpringBootApplication,这个注解是我们进行原理分析和源码跟踪的关键。我们进入看看。该注解也是Springboot框架中最重要的注解。 进入SpringBootApplication注解中,我们可以看到如下: 这些注解中只有一个注解的功能我们还不清楚,就是@EnableAutoConfiguration,看来这个注解就是实现自动配置的关键注解。 下面我们就来研究这个注解。 二. @EnableAutoConfiguration 上一小节中我们提到,@EnableAutoConfiguration这个注解以及以enable打头的注解当中封装了一个注解,就是@Import注解。通过@Import来导入指定的bean或者配置类。我们进入到@EnableAutoConfiguration这个注解当中,发现果然有一个 @Import注解。@Import注解当中封装的是一个AutoConfigurationImportSelector类。而 ImportSelector是一个接口,AutoConfigurationImportSelector类其实就是 ImportSelector这个接口的实现类,下面我们就来找这个ImportSelector接口。 接下来我们进入到AutoConfigurationImportSelector这个实现类当中。当前类实现了DeferredImportSelector这个接口。 我们再进入DeferredImportSelector,这个接口又继承了ImportSelect这个接口。 在ImportSelect这个接口中有一个非常重要的接口方法selectImports,这个方法的返回值String类型的数组中封装的是哪些类我们需要导入到IOC容器当中。里面封装的就是这些类的全类名。 下面我们就要找到ImportSelector这个接口的实现类,也就是AutoConfigurationImportSelector这个类中的selectImports这个方法,我们就重点关注selectImports这个方法的返回值。该返回值是一个String类型的数组,使用StringUtils这个工具类的toStringArray方法返回,该方法传递了一个autoConfigurationEntry对象,该对象调用getConfigurations()方法。 autoConfigurationEntry对象是调用getAutoConfigurationEntry这个方法获取到的,因此下面的关键就是查看getAutoConfigurationEntry这个方法。 这个方法的返回值是一个AutoConfigurationEntry对象,里面传递两个参数,一个是configurations,一个是exclusions。 通过上面的selectImports方法可以知道最终它调用了getConfigurations()这个方法,因此关键点就在于这个configurations参数。我们可以看到configurations这个List集合是通过getCandidateConfigurations这个方法获得的。我们查看该方法。 在该方法中我们在生成configurations这个List集合的时候调用了这么一个方法loadFactoryNames,在下面有一个断言,用来判断configurations这个集合是否是空的。如果是空的就会报下面的信息:没有META-INF/spring.factories或META-INF/spring/org......这两个自动配置的类被发现。 也就是说在spring项目执行的时候会自动加载这两个文件中所配置的信息,把这两个文件中配置的信息加载出来后封装到list集合中,最终list集合中的内容再封装到String[]类型的数组中。String[]类型的数组中存储的就是要加载到IOC容器中的bean或者配置类。 现在的关键点就是要找到这两份文件。 3.自动配置文件 这两份文件在我们引入的起步以来当中基本上都有。spring-boot-autoconfigure这个这个依赖就是自动配置的依赖,在这个jar包当中就会有这类文件。 mybatis依赖jar包中也有 那么我们就找到这些jar包,看看里面都配置了什么信息。我们找到library 点击在这里面,找到spring.factories文件。里面配置了很多信息。 这些信息就是这些要自动配置的类的全类名。 以及第二个文件org.springframework.boot.autoconfigure.AutoConfiguration.imports,里面配置的都是全类名。这些文件中的内容会被读取出来最总加载到IOC容器中成为IOC容器中的bean对象。这些类都是自动配置类。 之前我们使用的Gson对象,虽然我们没有配置但是可以直接使用,原因就是进行了自动配置。我们可以找打Gson这个自动配置类,查看他的源码。 源码中上面有一个注解@AutoConfiguration,底层就封装了一个注解@Configuration,那就说明当前类是一个配置类。 之所以能够完成自动配置,就是因为里面定义了一个gson方法,且返回值就是Gson类型的数据,上面定义了一个@Bean注解。因此才可以直接使用@Autowired注入该bean对象直接使用。 4.总结 @SpringBootApplication注解中封装了三个关键注解@SpringBootConfiguration,@ComponentScan,@EnableAutoConfiguration。而在@EnableAutoConfiguration底层封装了一个@Import注解。传入的是ImportSelector接口的实现类,这个接口中的方法selectImports()方法,导入了两个文件,这两个文件中指定了,要自动配置的类的全类名。 注:spring.factories配置文件已被移除。 以上就是spring实现自动配置的原理。 相关文章: SEKI —— 基于大型语言模型的自进化与知识启发式神经架构搜索 蓝桥杯备赛Day12 动态规划1基础 UDP透传程序 数据结构:哈希表 Django 项目模块化开发指南:实现 Vue 风格的组件化 基础工具常用api汇总(机器学习) modbus 协议的学习,谢谢老师 字节跳动系统攻防算法岗-Flow安全内推 从“搜索”到“对话”:AI帮助中心如何重塑用户体验? 如何配置虚拟机IP? MyBatis-Plus 逻辑删除实现 leetcode 240. 搜索二维矩阵 II 关于虚拟环境中遇到的bug SFT与RLHF的关系 QT5 GPU使用 白帽子讲Web安全资源下载 JS禁止web页面调试 ⭐算法OJ⭐字符串与数组【动态规划 DP】(C++实现)最长公共子序列 LCS + 最短公共超序列 SCS 洛谷 P11830 省选联考2025 幸运数字 题解 【编程题】7-3 树的同构 网站建设工期/网页推广平台 广告公司网站开发/网站优化要做哪些 制作音乐网站实验报告/google play官网 厦门建网站多少钱/河南最近的热搜事件 网站建设网站模板/互联网营销师课程 浙江省建设职业注册中心网站/网络培训心得体会5篇