Spring Boot Configuration和AutoConfiguration加载逻辑和加载顺序调整

在spring中, AutoConfiguration也是一个种Configuration,只是AutoConfiguration是不能使用proxy的。
在这里插入图片描述
而且spring对于两者的加载顺序也不是一视同仁,是有顺序的。spring会先加载@SpringBootApplication可达的且标注了@Configuration的类,这个过程会将@AutoConfiguration标注的类给过滤掉; 然后再通过spring spi加载AutoConfiguration,并且在这一过程中,会根据@AutoConfigureOrder, @AutoConfigureBefore, @AutoConfigureAfter这三个注解进行排序。

Configuration加载逻辑

springboot 处理ConfigBeanDefinition时,根据@SpringBootApplication注解处理Configuration和Bean的加载逻辑,处理逻辑其实就是一个Configuration类的解析逻辑,如下:

  1. 处理Component注解
    • 如果MemberClass有标注@Component、@CompentScan、@Import、@ImportResource注解以及方法有标注@Bean注解,对MemberClass执行Configuration类的解析逻辑
  2. 处理PropertySources注解
  3. 处理ComponentScan
    • 进行类扫描
      • 指定扫描包路径下的类
      • 过滤标有@AutoConfiugration注解的类
    • 将扫描出来的类执行Configuration类的解析逻辑
  4. 处理@Import
    • 如果是ImportSelector类型,单独处理
    • 如果ImportBeanDefinitionRegistrar类型,单独处理
    • 否则执行类的Configuration类的解析逻辑
  5. 处理@ImportResource
  6. 将ConfigurationBean添加到LinkedHashMap中
  7. 执行ImportSelector
    • 由于@SpringBootApplication注解标有@EnableAutoConfiguration,所以会执行org.springframework.boot.autoconfigure.AutoConfigurationImportSelector
      • 调用其内部类AutoConfigurationGroup的process()和selectImports()方法加载AutoConfiguration

执行截图如下:
在这里插入图片描述

从上面的逻辑可以看出,对于Configuration是无法有效管理其加载顺序,但是可以根据其加载逻辑通过@Import或者@ComponentScan等其它相关注解优化以解决非预期加载顺序的场景。

AutoConfiguration加载逻辑

  • ConfigurationClassParser.parse()
    • DeferredImportSelectorHandler.process()
      • AutoConfigurationGroup.process()
        • AutoConfigurationImportSelector.getAutoConfigurationEntry(): 获取到AutoConfiguration类信息列表后,去重、排除@EnableAutoConfiguration中的exclude、触发AutoConfigurationImportEvent
          • ImportCandidates.load(): 从META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 中获取AutoConfiguration类信息
      • AutoConfigurationGroup.selectImports()
        • AutoConfigurationGroup.sortAutoConfigurations()
          • AutoConfigurationSorter.getInPriorityOrder(): AutoConfiguration排序,可以通过@AutoConfigureOrder, @AutoConfigureBefore, @AutoConfigureAfter

执行截图如下:
在这里插入图片描述

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

Bean的加载

接下是在Configuration是否满足条件,即执行Conditional条件判断,例@Conditonal, @ConditionalOnProperties等,如果不满足条件则略过Configuration。如果满足条件,则会继续加载Configration 中用于@Bean标注的方法。
在这里插入图片描述
在这里插入图片描述

对于Bean的加载逻辑也是一样会去判断Conditional,如果不符合加载条件则会略过,如果符合则会进行加载。
在这里插入图片描述
在这里插入图片描述

总结

  1. @SpringBootApplication可达的Configuration的加载要先于AutoConfiguration
  2. 对于Configuration加载顺序可以通过其加载机制使用@Import @ComponentScan等注解进行优化调整
  3. 对于AutoConfiguration的加载顺序可以通过@AutoConfigureOrder, @AutoConfigureBefore, @AutoConfigureAfter进行调整

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/460579.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CodeS:构建用于文本到 SQL 的开源语言模型

发布于:2024 年 10 月 29 日 #RAG #Text2 SQL #NL2 SQL 语言模型在将自然语言问题转换为 SQL 查询(文本到 SQL )的任务中显示出良好的性能。然而,大多数最先进的 (SOTA) 方法都依赖于强大但闭源的大型语言…

社区交流系统设计与实现

社区交流系统设计与实现 1. 系统概述 社区交流系统是一个基于PHP和SQL的Web应用程序,旨在为用户提供一个互动交流的平台。该系统允许用户注册、发布帖子、回复帖子、查看其他用户的帖子和回复,以及管理个人资料,提高用户之间的互动和信息共享…

什么是字节序、大小端、高低字节、高低地址?

目录 1. 什么是字节序(Endianness)? 2. 什么是大小端(Big-Endians and Little-Endian)? 3. 什么时候需要用到大小端的概念? 4. 如何确认系统的大小端模式? 5. 什么是大小端定义…

为什么 C 语言数组是从 0 开始计数的?

C 语言等大多数编程语言的数组从 0 开始而不从 1 开始,有两个原因: 第一:地址计算更方便 C 语言从 0 开始的话,array[i] 的地址就正好是: (array i) 如果是从 1 开始的话,就是 (array i - 1) 多一次计…

锁升级及线程池相关

锁升级 在JVM底层实现锁的过程中,有三类锁:偏斜锁、轻量级锁、重量级锁 在Java6之前,synchronized的实现完全依靠重量级锁(系统内的互斥锁),从用户态转为内核态非常消耗资源。在Java6之后,提供…

vue3+less使用主题定制(多主题定制)可切换主题

假如要使用两套主题:蓝色、红色 例如: 首先确保自己的vue3项目有less,这边不多做接入解释 1、在src目录下建一个styles文件夹,在syles文件夹下面新建两个less文件:theme.less和variables.less; theme.le…

Java面试经典 150 题.P80. 删除有序数组中的重复项 II(004)

本题来自:力扣-面试经典 150 题 面试经典 150 题 - 学习计划 - 力扣(LeetCode)全球极客挚爱的技术成长平台https://leetcode.cn/studyplan/top-interview-150/ 题解: class Solution {public int removeDuplicates(int[] nums)…

【QNAP威联通NAS系统恢复进阶教程】如果 .conf 和 md9 无法自动组装,如何恢复 NAS?

创作立场:原创不易,拒绝搬运~ hello大家好,我是你们的老伙伴,稳重的大王~ 从本期开始,大王将在日常教程中,分享一些QNAP系统故障的排除以及解决办法,进阶教程需要具备一定的linux基础&#xf…

【JavaEE】【多线程】进阶知识

目录 一、常见的锁策略1.1 悲观锁 vs 乐观锁1.2 重量级锁 vs 轻量级锁1.3 挂起等待锁 vs 自旋锁1.4 普通互斥锁 vs 读写锁1.5 可重入锁 vs 不可重入锁1.6 不公平锁 vs 公平锁 二、synchronized特性2.1 synchronized的锁策略2.2 synchronized加锁过程2.3 其它优化措施 三、CAS3.…

玄机-应急响应- Linux入侵排查

一、web目录存在木马,请找到木马的密码提交 到web目录进行搜索 find ./ type f -name "*.php" | xargs grep "eval(" 发现有三个可疑文件 1.php看到密码 1 flag{1} 二、服务器疑似存在不死马,请找到不死马的密码提交 被md5加密的…

沈阳乐晟睿浩科技有限公司抖音小店运营创新

在当今这个数字化迅猛发展的时代,电子商务已经成为推动经济增长的重要引擎。而在电商的广阔舞台上,短视频与直播带货的崛起无疑是最为耀眼的明星之一。作为这一领域的佼佼者,抖音小店凭借其庞大的用户基础和独特的算法优势,吸引了…

使用Python和Parsel库爬取CSDN博客文章专栏并生成Markdown链接列表的导航

引言 今天,我将分享如何使用Python的requests和parsel库来爬取CSDN博客的文章,并生成一个Markdown格式的链接列表导航页。 我在整理这个专栏Linux基础操作合集的文章合集时,发现想要给这个专栏的文章做个导航合集页很麻烦,虽然直…

哪个牌子的宠物空气净化器好?口碑好的宠物空气净化器推荐!

哪个牌子的宠物空气净化器好?作为一名家电测评博主,我发现市面上宠物空气净化器的牌子越来越多了,很多厂家都看中了宠物行业的红利,想来分一杯羹,这就导致很多技术不成熟的产品流入了市场。今年我测试了50多台宠物空气…

数据清理——确保数据质量的关键步骤

简介 在数据分析和机器学习中,数据清理是预处理过程中的重要一环。良好的数据清理能够提高数据的质量,从而提升模型的准确性和可靠性。本篇文章将深入探讨数据清理的几个关键知识点,包括缺失值处理、数据不一致问题和噪声处理。通过详细的概…

isp框架代码理解

一、整体框架如下: 1 外层的src中 1.1 从camera.c->task.c:封装了3层,透传到某个功能的本级。 1.2 core.c和capability.c中实现:开机初始化加载参数。2. plat/src中 2.1 fun.c中继task.c又透传了一层;以及最后功能…

状态机模型

文章目录 一、大盗阿福二、股票买卖 IV三、股票买卖 V四、设计密码4.1kmp题目4.2设计密码 一、大盗阿福 题目链接 #include<iostream> #include<cstring> #include<algorithm> using namespace std; const int N 1e5 10; int f[N][2]; int main() {int…

MATLAB——矩阵操作

内容源于b站清风数学建模 数学建模清风老师《MATLAB教程新手入门篇》https://www.bilibili.com/video/BV1dN4y1Q7Kt/ 目录 1.MATLAB中的向量 1.1向量创建方法 1.2向量元素的引用 1.3向量元素修改和删除 2.MATLAB矩阵操作 2.1矩阵创建方法 2.2矩阵元素的引用 2.3矩阵…

一:Linux学习笔记(第一阶段)-- 安装软件 vmware workstation 虚拟机软件 centos系统

目录 学习计划&#xff1a; 资源准备 虚拟机软件&#xff1a;就别自己找了 现在换网站了 下载比较费劲 Centos8&#xff1a; 阿里云镜像地址下载&#xff08;下载比较版 但是有不同版本&#xff09;&#xff1a;centos安装包下载_开源镜像站-阿里云 百度网盘地址&#xff…

如何在Linux系统中使用Zabbix进行监控

如何在Linux系统中使用Zabbix进行监控 Zabbix简介 安装Zabbix 在Debian/Ubuntu系统中安装 在CentOS/RHEL系统中安装 配置Zabbix数据库 创建数据库 导入数据库 配置Zabbix服务器 访问Zabbix Web界面 完成初始配置 配置Zabbix Agent 安装Agent 配置Agent 添加主机到Zabbix 创…

uniapp编译多端项目App、小程序,input框键盘输入后

项目场景&#xff1a; uniapp编译后的小程序端&#xff0c;app端 在一个输入框 输入消息后&#xff0c;点击键盘上的操作按钮之后键盘不被收起&#xff0c;点击其他发送按钮时&#xff0c;键盘也不被收起。 问题描述 在编译后的app上普通的事件绑定&#xff0c;tap,click在发…