【Spring Boot 源码学习】深入 FilteringSpringBootCondition
走近 AutoConfigurationImportFilter
- 引言
- 往期内容
- 主要内容
- 1. match 方法
- 2. ClassNameFilter 枚举类
- 3. filter 方法
- 总结
引言
前两篇博文笔者带大家从源码深入了解了 Spring Boot 的自动装配流程,其中自动配置过滤的实现由于篇幅限制,还未深入分析。
那么从本篇开始,Huazie 就带大家走近 AutoConfigurationImportFilter
,一起从源码解析 FilteringSpringBootCondition
、OnBeanCondition
、OnClassCondition
、OnWebApplicationCondition
的实现。
往期内容
在开始本篇的内容介绍之前,我们先来看看往期的系列文章【有需要的朋友,欢迎关注系列专栏】:
Spring Boot 源码学习 |
Spring Boot 项目介绍 |
Spring Boot 核心运行原理介绍 |
【Spring Boot 源码学习】@EnableAutoConfiguration 注解 |
【Spring Boot 源码学习】@SpringBootApplication 注解 |
【Spring Boot 源码学习】走近 AutoConfigurationImportSelector |
【Spring Boot 源码学习】自动装配流程源码解析(上) |
【Spring Boot 源码学习】自动装配流程源码解析(下) |
主要内容
在开始本篇内容之前,我们再次来回顾一下上篇博文介绍的 AutoConfigurationImportFilter
的源码和相关的类图:
@FunctionalInterface
public interface AutoConfigurationImportFilter {// 自动配置组件的过滤匹配boolean[] match(String[] autoConfigurationClasses, AutoConfigurationMetadata autoConfigurationMetadata);
}
通过上面的关联类图,我们可以看到 AutoConfigurationImportFilter
接口实际上是由抽象类 FilteringSpringBootCondition
来实现的,另外翻看它的源码,该抽象类还定义了一个抽象方法 getOutcomes
,然后 OnBeanCondition
、OnClassCondition
、OnWebApplicationCondition
继承该抽象类,实现 getOutcomes
方法,完成实际的过滤匹配操作。
本篇,我们就从源码入手重点介绍 FilteringSpringBootCondition
:
1. match 方法
上一篇博文我们已经从 FilteringSpringBootCondition
的部分源码进行了分析,它的 match
方法主要是调用 getOutcomes
方法,并将其返回的结果转换成布尔数组。而这个 getOutcomes
方法是过滤匹配的核心功能,由抽象类 FilteringSpringBootCondition 的子类来实现它。
这里再简单回顾一下 match
方法的处理逻辑:
@Override
public boolean[] match(String[] autoConfigurationClasses, AutoConfigurationMetadata autoConfigurationMetadata) {ConditionEvaluationReport report = ConditionEvaluationReport.find(this.beanFactory);// 调用 由子类实现的 getOutcomes 方法,完成实际的过滤匹配操作ConditionOutcome[] outcomes = getOutcomes(autoConfigurationClasses, autoConfigurationMetadata);boolean[] match = new boolean[outcomes.length];// 将 getOutcomes 方法返回结果转换成布尔数组for (int i = 0; i < outcomes.length; i++) {match[i] = (outcomes[i] == null || outcomes[i].isMatch());if (!match[i] && outcomes[i] != null) {logOutcome(autoConfigurationClasses[i], outcomes[i]);if (report != null) {report.recordConditionEvaluation(autoConfigurationClasses[i], this, outcomes[i]);}}}return match;
}
上述代码中,我们可以看到,将 getOutcomes
方法返回结果转换成布尔数组的循环逻辑中有一段代码如下:
match[i] = (outcomes[i] == null || outcomes[i].isMatch());
这里是将返回结果转换成布尔值,分别是:
- 如果匹配结果为
null
,认为符合匹配要求, 设置match[i] = true
; - 如果匹配结果不为
null
,并且 匹配对象的isMatch = true
,也认为符合匹配要求, 设置match[i] = true
;
这个时候,我们就能理解 上篇博文讲到的 不符合过滤匹配要求,则清空当前的自动配置组件 的逻辑:
当然 FilteringSpringBootCondition
内还有其他的内容,这些内容在它的子类中也将使用到,我们先提前了解下,以便后续能更好地理解子类的功能实现。
2. ClassNameFilter 枚举类
首先查看 ClassNameFilter
枚举类的源码【Spring Boot 2.7.9】:
protected enum ClassNameFilter {PRESENT {@Overridepublic boolean matches(String className, ClassLoader classLoader) {return isPresent(className, classLoader);}},MISSING {@Overridepublic boolean matches(String className, ClassLoader classLoader) {return !isPresent(className, classLoader);}};abstract boolean matches(String className, ClassLoader classLoader);// ....}
ClassNameFilter
枚举类包含两个枚举常量,分别是 PRESENT
和 MISSING
;这两个枚举常量都实现了 ClassNameFilter
枚举类定义的 matches
的抽象方法,其中
PRESENT
中的matches
返回isPresent(className, classLoader);
MISSING
中的matches
返回!isPresent(className, classLoader);
我们继续看 isPresent 方法,分析一下它的功能:
static boolean isPresent(String className, ClassLoader classLoader) {if (classLoader == null) {classLoader = ClassUtils.getDefaultClassLoader();}try {resolve(className, classLoader);return true;}catch (Throwable ex) {return false;}
}protected static Class<?> resolve(String className, ClassLoader classLoader) throws ClassNotFoundException {if (classLoader != null) {return Class.forName(className, false, classLoader);}return Class.forName(className);
}
上述 isPresent
方法的逻辑其实也并不复杂,就是通过类加载器去加载指定的类【即 className 字符串对应的类】:
- 如果指定的类加载成功,则直接返回
true
; - 如果指定的类加载失败,则要抛出异常,捕获异常后,返回
false
。
那显然 ClassNameFilter.PRESENT.matches(className, classLoader)
用于校验指定的类是否加载成功:
- 如果指定的类加载成功,则返回
true
; - 如果指定的类加载失败,则返回
false
。
而 ClassNameFilter.MISSING.matches(className, classLoader)
用于校验指定的类是否加载失败:
- 如果指定的类加载失败,则返回
true
; - 如果指定的类加载成功,则返回
false
。
3. filter 方法
继续翻看 FilteringSpringBootCondition
源码,还有一个 filter
方法需要重点介绍下:
protected final List<String> filter(Collection<String> classNames, ClassNameFilter classNameFilter, ClassLoader classLoader) {if (CollectionUtils.isEmpty(classNames)) {return Collections.emptyList();}List<String> matches = new ArrayList<>(classNames.size());for (String candidate : classNames) {if (classNameFilter.matches(candidate, classLoader)) {matches.add(candidate);-}}return matches;
}
结合上面的 ClassNameFilter
枚举类,我们可以很容易理解上面的代码逻辑。
- 如果
classNameFilter
是ClassNameFilter.PRESENT
,则filter
方法获取指定的类集合中加载成功的类集合【即匹配成功的类集合】; - 如果
classNameFilter
是ClassNameFilter.MISSING
,则filter
方法获取指定的类集合中加载失败的类集合【即匹配失败的类集合】。
总结
本篇 Huazie 带大家介绍了自动配置过滤匹配的核心父类 FilteringSpringBootCondition
,这对于笔者后续博文详解它的三个子类【OnBeanCondition
、OnClassCondition
、OnWebApplicationCondition
】非常重要,敬请期待!!!。
相关文章:
【Spring Boot 源码学习】深入 FilteringSpringBootCondition
走近 AutoConfigurationImportFilter 引言往期内容主要内容1. match 方法2. ClassNameFilter 枚举类3. filter 方法 总结 引言 前两篇博文笔者带大家从源码深入了解了 Spring Boot 的自动装配流程,其中自动配置过滤的实现由于篇幅限制,还未深入分析。 …...
docker 笔记6:高级篇 DockerFile解析
目录 1.是什么? 2.构建三步骤 3.DockerFile构建过程解析 3.1 Dockerfile内容基础知识 3.2Docker执行Dockerfile的大致流程 总结 4.DockerFile常用保留字指令 5.案例:自定义镜像 5.1 要求: Centos7镜像具备vimifconfigjdk8 5.2编写 5…...
微信小程序navigateTo进入页面后返回原来的页面需要携带数据回来
需求 如图:点击评论后会通过wx.navigateTo进入到评论页面,评论完返回count给原页面,重新赋值实现数量动态变化,不然要刷新这个页面才会更新最新的评论数量。 实现方式: 在评论页面通过wx.setStorageSync(‘data’…...
Python照片压缩教程详解
介绍 在日常的编程工作中,我们经常需要处理图像,例如上传、下载、显示、编辑等。有时候,我们需要对图像进行压缩,以减少占用的空间和带宽,提高加载速度和用户体验。那么,如何用Python来实现图像压缩呢&…...
软路由的负载均衡设置:优化网络性能和带宽利用率
在现代网络环境中,提升网络性能和最大化带宽利用率至关重要。通过合理配置软路由IP的负载均衡设置,可以有效地实现这一目标,并提高整体稳定性与效果。本文将详细介绍如何进行软路由IP的负载均衡设置,从而优化网络表现、增加带宽利…...
CH06_第一组重构(上)
提取函数(Extract Function |106) 曾用名:提炼函数(Extract Function) 反向重构:内联函数(115) 示例代码 function printOwing(invoice) {printBanner();let outstanding calcul…...
RHCSA-VMware Workstation Pro-Linux基础配置命令
1.代码命令 1.查看本机IP地址: ip addr 或者 ip a [foxbogon ~]$ ip addre [foxbogon ~]$ ip a 1:<Loopback,U,LOWER-UP> 为环回2网卡 2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP>为虚拟机自身网卡 2.测试网络联通性: [f…...
YOLO-NAS详细教程-姿势估计实现
姿势估计是一项计算机视觉任务,涉及估计图像或视频中物体或人的位置和方向。它通常涉及识别特定的关键点或身体部位(例如关节),并确定它们的相对位置和方向。姿势估计有许多应用,包括机器人、增强现实、人机交互和运动分析。 自上而下和自下而上是姿态估计中两种常用的方法…...
【扩散模型 李宏毅B站教学以及基础代码运用】
李宏毅教学视频: Link1 B站DDPM公式推导以及代码实现: Link2 这个视频里面有论文里面的公式推导,并且1小时10分开始讲解实例代码。 文章目录 扩散模型概念:Diffusion Model工作原理:影像生成模型本质上的共同目标B站…...
SpringBoot隐藏文件
1.设置 2.输入file Types 3.点击忽略文件或者文件夹 4.成功...
常见数据库介绍对比之SQL关系型数据库
1.关系型数据库介绍 关系型数据库是一种基于关系模型的数据库,它使用表格来组织和存储数据。下面是一些常见的关系型数据库: 1.1. MySQL MySQL是一种开源的关系型数据库管理系统(RDBMS),广泛用于Web应用程序和企业级…...
OLED透明屏模块:引领未来显示技术的突破
OLED透明屏模块作为一项引领未来显示技术的突破,以其独特的特点和卓越的画质在市场上引起了广泛关注。 根据行业报告,预计到2025年,OLED透明屏模块将占据智能手机市场的20%份额,并在汽车导航系统市场中占据30%以上份额。 那么&am…...
Python_操作记录
1、Pandas读取数据文件(以文本文件作为示例),sep表示间隔,headerNone表示无标题行 df pd.read_table("data/youcans3.dat", sep"\t", headerNone) 2、线性规划问题求解 1)问题定义,…...
常用激活函数整理
最近一边应付工作,一边在补足人工智能的一些基础知识,这个方向虽然新兴,但已是卷帙浩繁,有时不知从何入手,幸亏有个适合基础薄弱的人士学习的网站,每天学习一点,积跬步以至千里吧。有像我一样学…...
uniapp 地图跳转到第三方导航软件 直接打包成apk
// 判断是否存在导航软件judgeHasExistNavignation() {let navAppParam [{pname: com.baidu.BaiduMap,action: baidumap://}, // 百度{pname: com.autonavi.minimap,action: iosamap://}, // 高德{pname: com.tencent.map,action: tencentmap://}, // 腾讯];return navAppPara…...
CentOS 8 通过YUM方式升级最新内核
CentOS 8 通过YUM方式升级最新内核 查看当前内核 uname -r 4.18.0-193.6.3.el8_2.x86_64导入 ELRepo 仓库的公钥: rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org安装升级内核相关的yum源仓库(安装 ELRepo 仓库的 yum 源) yum install https://www…...
java 版本企业招标投标管理系统源码+功能描述+tbms+及时准确+全程电子化
功能描述 1、门户管理:所有用户可在门户页面查看所有的公告信息及相关的通知信息。主要板块包含:招标公告、非招标公告、系统通知、政策法规。 2、立项管理:企业用户可对需要采购的项目进行立项申请,并提交审批,查看所…...
Python爬虫数据存哪里|数据存储到文件的几种方式
前言 大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 爬虫请求解析后的数据,需要保存下来,才能进行下一步的处理,一般保存数据的方式有如下几种: 文件:txt、csv、excel、json等,保存数据量小。 关系型数据库…...
软件测试/测试开发丨Web自动化 测试用例流程设计
点此获取更多相关资料 本文为霍格沃兹测试开发学社学员学习笔记分享 原文链接:https://ceshiren.com/t/topic/27173 一、测试用例通用结构回顾 1.1、现有测试用例存在的问题 可维护性差可读性差稳定性差 1.2、用例结构设计 测试用例的编排测试用例的项目结构 1…...
git撤销修改命令
要撤销Git中尚未提交的所有修改,可以使用以下几种方法: 1、使用git checkout命令丢弃工作目录的修改,重置工作目录中所有文件的修改。 git checkout . 2、使用git reset命令重置暂存区和工作目录, 重置暂存区和工作目录,回到最后一次提交后的状态。 …...
EOCR-AR电机保护器自动复位的启用条件说明
为适用不同的现场使用需求,施耐德韩国公司推出了带有自动复位功能的模拟型电动机保护器-EOCR-AR。EOCR-AR电机保护器具有过电流、缺相、堵转保护功能,还可根据实际需要设置自动复位时间。 EOCR-AR自动复位的设置方法 如上图,R-TIME旋钮是自动…...
Apache nginx解析漏洞复现
文章目录 空字节漏洞安装环境漏洞复现 背锅解析漏洞安装环境漏洞复现 空字节漏洞 安装环境 将nginx解压后放到c盘根目录下: 运行startup.bat启动环境: 在HTML文件夹下有它的主页文件: 漏洞复现 nginx在遇到后缀名有php的文件时,…...
.NET之后,再无大创新
回想起来,2001年发布的.NET已经是距离最近的一次软件开发技术的整体创新了,后续的新技术就没有在各个端都这么成功的了。.NET是Windows平台下软件开发技术的巨大变革。在此之前,有VB、C(MFC)、JSP,在此之后…...
【大麦小米学量化】什么是量化交易?哪些人适合做量化交易?
系列文章目录 文章目录 系列文章目录学霸的梦想前言一、什么是量化交易?二、哪些人适合做量化交易?三、量化交易都需要掌握哪些技术和方法?总结 学霸的梦想 小米支棱着迷糊的眼睛,一脸懵逼的问大麦:“我说大麦哥哥&…...
计算机视觉的应用12-卷积神经网络中图像特征提取的可视化研究,让大家理解特征提取的全过程
大家好,我是微学AI,今天给大家介绍一下计算机视觉的应用12-卷积神经网络中图像特征提取的可视化研究,让大家理解特征提取的全过程。 要理解卷积神经网络中图像特征提取的全过程,我们可以将其比喻为人脑对视觉信息的处理过程。就像…...
el-table中点击跳转到详情页的两种方法
跳转的两种写法: 1.使用keep-alive使组件缓存,防止刷新时参数丢失 keep-alive 组件用于缓存和保持组件的状态,而不是路由参数。它可以在组件切换时保留组件的状态,从而避免重新渲染和加载数据。 keep-alive 主要用于提高页面性能和用户体验,而…...
RT-DETR个人整理向理解
一、前言 在开始介绍RT-DETR这个网络之前,我们首先需要先了解DETR这个系列的网络与我们常提及的anchor-base以及anchor-free存在着何种差异。 首先我们先简单讨论一下anchor-base以及anchor-free两者的差异与共性: 1、两者差异:顾名思义&…...
易点易动库存管理系统与ERP系统打通,帮助企业实现低值易耗品管理
现今,企业管理日趋复杂,无论是核心经营还是辅助环节,都需要依靠信息化手段来提升效率。而低值易耗品作为企业日常运营中的必需品,其管理也面临诸多挑战。传统做法效率低下,容易出错。如何通过信息化手段实现低值易耗品的高效管理,成为许多企业必顾及的一个课题。 易点易动作为…...
【笔试强训选择题】Day34.习题(错题)解析
作者简介:大家好,我是未央; 博客首页:未央.303 系列专栏:笔试强训选择题 每日一句:人的一生,可以有所作为的时机只有一次,那就是现在!!!ÿ…...
“现代”“修饰”卷积神经网络,何谓现代
一、“现代” vs “传统” 现代卷积神经网络(CNNs)与传统卷积神经网络之间存在一些关键区别。这些区别主要涉及网络的深度、结构、训练技巧和应用领域等方面。以下是现代CNNs与传统CNNs之间的一些区别: 深度: 传统CNNs࿱…...
做电商网站一般多少钱/seo百度首页排名业务
接收从控制台输入的数据可以使用Scanner类实现,Scanner类在一个名为util的包中需要在程序中导入这个包, 即在程序中添加import java.util.*;Scanner类可以接收int string char boolean 等类型数据,其中string类型数据使用next() 或者 nextLin…...
徐州专业三合一网站开发/seo的概念是什么
本贴仅是我的一个网摘,不适合阅读,请勿吐槽... ----------------------------------------- set cursorcolumn " 高亮光标列 set cursorline " 高亮光标行 f转载于:https://www.cnblogs.com/vimmer/archive/2012/03/12/2391501.html...
国外做蛋糕网站/企业营销网站制作
一、格式化文件系统 mkfs当完成硬盘分区以后要进行硬盘的格式化,mkfs系列对应的命令用于将硬盘格式化为指定格式的文件系统。mkfs 本身并不执行建立文件系统的工作,而是去调用相关的程序来执行。例如,若在 -t 参数中指定 ext2,则m…...
青岛新闻网官方网站/网站推广优化方式
单源最短路径 穿插一下我是如何建图的: 我采用的建图方式是邻接表:用vector数组进行实现 //我习惯与自己写结构体,当然也可以采用自带的pair struct edge{int v,w;//顶点和边的权值 }; //写一个初始化函数存图 edge make_edge(int _v,int _…...
wordpress增加菜单/seo关键词排名在线查询
文章相关视频教程下载地址http://pan.baidu.com/s/1pKY4gzh (2)添加WM_CTLCOLOR的反射消息响应函数 要改变编辑框中文字颜色、背景等,需要对该控件的WM_CTLCOLOR消息进行响应,重写该消息的响应函数。 将鼠标焦点设置到CMyEdit.…...
婚纱摄影网站源码asp/宁德市医院东侨院区
目录 目录 1 引言 2 什么是异常 2.1 Java中的异常体系 3 常见的处理方式 3.1 参数传递结果 3.2 每个方法都返回结果对象,或者状态码 错误码 调用的方法都返回错误码 3.3 自定义异常并捕获处理 异常定义 异常处理 4 spring-boot中处理方式 4.1 control…...