SpringBoot自动装配(二)
近日,余溺于先贤古哲之文无法自拔。虽未明其中真意,但总觉有理。遂抄录一篇以供诸君品鉴——公孙鞅曰:“臣闻之:‘疑行无名,疑事无功。’君亟定变法之虑,殆无顾天下之议之也。且夫有高人之行者,固见负于世;有独知之虑者,必见骜于民。语曰:‘愚者暗于成事,知者见于未萌。民不可与虑始,而可与乐成。’郭偃之法曰:‘论至德者,不和于俗;成大功者,不谋于众。’法者所以爱民也,礼者所以便事也。是以圣人苟可以强国,不法其故;苟可以利民,不循其礼。”
余觉“愚者暗于成事,知者见于未萌”极富道理。吾常昏聩于事成,虽欲梳之,却无人问津矣!故常不解周遭之所为,甚欲恶语向之。譬如本篇:何为自动装配?若美帝科幻巨制之机器人,勿需人工,程序自动为之也。每欲言之,人多避之。吾甚不解,窃语曰:“此虽小,却也值庆,如此为之,却是为何?”思虑再三,决意书之。
前篇(《SpringBoot自动装配(一)》)言至自动装配之入口及过程。虽小有所得,但终是狂妄自大,思虑不周,遗问颇多,譬如:千万自配者,何以滤之?说白了,就是我没有搞清楚SpringBoot启动时是如何对自动装配类进行过滤的。还有上篇文章想当然的认为DeferredImportSelector接口的实现类AutoConfigurationImportSelector中的selectImports()方法是在ConfigurationClassParser#processImports(ConfigurationClass configClass, SourceClass currentSourceClass, Collection<SourceClass> importCandidates, boolean checkForCircularImports)方法中调用的,不过经人提醒后发现其实并非如此。
1 Spring是如何决定加载哪些配置类的?
要回答这个问题,我们首先要知道Spring是何时何地开始加载自动配置类的。巧的是上篇文章对这个点进行了梳理,这个入口就在AutoConfigurationImportSelector类的selectImports(AnnotationMetadata annotationMetadata)方法中,这个方法执行了一堆逻辑(具体可参见《SpringBoot自动装配(一)》这篇文章的三小节),其中有一段代码是这样写的:
configurations = filter(configurations, autoConfigurationMetadata);
与这个调用相关的方法位于AutoConfigurationImportSelector类中,与调用者selectImports()方法处于同一类中,其具体源码如下所示:
private List<String> filter(List<String> configurations,AutoConfigurationMetadata autoConfigurationMetadata) {long startTime = System.nanoTime();String[] candidates = configurations.toArray(new String[configurations.size()]);boolean[] skip = new boolean[candidates.length];boolean skipped = false;for (AutoConfigurationImportFilter filter : getAutoConfigurationImportFilters()) {invokeAwareMethods(filter);boolean[] match = filter.match(candidates, autoConfigurationMetadata);for (int i = 0; i < match.length; i++) {if (!match[i]) {skip[i] = true;skipped = true;}}}if (!skipped) {return configurations;}List<String> result = new ArrayList<String>(candidates.length);for (int i = 0; i < candidates.length; i++) {if (!skip[i]) {result.add(candidates[i]);}}if (logger.isTraceEnabled()) {int numberFiltered = configurations.size() - result.size();logger.trace("Filtered " + numberFiltered + " auto configuration class in "+ TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - startTime)+ " ms");}return new ArrayList<String>(result);
}
这个方法首先将configurations集合转变为String[]类型的数组(变量candidates,注意跟踪时这个对象的数量为127);然后创建boolean[]类型的变量skip(注意其大小与candidates的大小一致);接着调用本类中的getAutoConfigurationImportFilters()方法获取一个AutoConfigurationImportFilter集合(该集合中只有一个元素,即OnClassCondition,这个类位于org.springframework.boot.autoconfigure.condition包中),并遍历这个集合(首先通过反射调用对象AutoConfigurationImportFilter上的Aware方法,接着调用AutoConfigurationImportFilter对象上的match()方法,实际调用的是OnClassCondition中的match()方法)。这里看一下Filter的体系结构:

相关文章:
SpringBoot自动装配(二)
近日,余溺于先贤古哲之文无法自拔。虽未明其中真意,但总觉有理。遂抄录一篇以供诸君品鉴——公孙鞅曰:“臣闻之:‘疑行无名,疑事无功。’君亟定变法之虑,殆无顾天下之议之也。且夫有高人之行者,…...
数据结构 顺序表1
1. 何为顺序表: 顺序表是一种线性数据结构,是由一组地址连续的存储单元依次存储数据元素的结构,通常采用数组来实现。顺序表的特点是可以随机存取其中的任何一个元素,并且支持在任意位置上进行插入和删除操作。在顺序表中…...
C++基础-编程练习题1
文章目录 一、哥德巴赫猜想二、哥德巴赫猜想2三、打印成绩单四、成绩输入输出五、数组输出奇数位偶数位 一、哥德巴赫猜想 【试题描述】 哥德巴赫提出了以下的猜想:任何一个大于 2 的偶数都可以表示成 2 个质数之和。 质数是指除了 1 和本身之外没有其他约数的数&a…...
四十九坊股权设计,白酒新零售分红制度,新零售策划机构
肆拾玖坊商业模式 | 白酒新零售体系 | 新零售系统开发 坐标:厦门,我是易创客肖琳 深耕社交新零售行业10年,主要提供新零售系统工具及顶层商业模式设计、全案策划运营陪跑等。 不花钱开3000多家门店,只靠49个男人用一套方法卖白酒…...
如何将公众号添加到CSDN个人主页
1. 创作中心- 推广管理 输入个人公众号名字并开启微信公众号推广 2. 将公众号的二维码图片加入拓展信息 个人主页的左下角就能看到推广 如果希望能看到是二维码 操作如下: 写篇文章贴上二维码 然后点击鼠标右键获得此页面链接 ,例如我的个人公众号 htt…...
64K方法数限制原理及解决方案
64K限制的原因 Android APK文件本质上是一个压缩文件,它包含的classes.dex文件是可执行的Dalvik字节码文件,这个.dex文件中存放的就是编译后的Java代码。Dalvik可执行文件规范限制了单个.dex文件最多引用的方法数是65536个。其中包含联网Android Framew…...
产品品牌CRUD
文章目录 1.renren-generator生成CRUD1.数据库表设计1.数据表设计2.分析 2.代码生成器生成crud1.查看generator.properties(不需要修改)2.修改application.yml 连接的数据库修改为云数据库3.启动renren-generator模块4.浏览器访问 http://localhost:81/5…...
惠普发布全新AI战略,重塑办公空间 引领企业智能化新浪潮
近日、全球知名科技公司惠普在北京隆重举办了以“用智能,开启无限可能”为主题的2024惠普商用AI战略暨AI PC新品发布会,此次盛会标志着惠普在人工智能领域迈出了重要一步,惠普紧跟时代步伐,推出了更高效、更安全、更灵活的AI PC产…...
python中的数据可视化:极坐标散点图
【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 python中的数据可视化: 极坐标散点图 [太阳]选择题 关于以下代码输出结果的说法中正确的是? import matplotlib.pyplot as plt import numpy as np n 150 r 2 * np.r…...
5.12.1 Detecting and classifying lesions in mammograms with Deep Learning
计算机辅助检测 (CAD) 系统的开发是为了帮助放射科医生分析筛查性乳房 X 光检查,深度 CNN 有可能彻底改变医学图像分析。我们提出了一种基于最成功的对象检测框架之一 Faster R-CNN 的 CAD 系统。该系统无需任何人为干预即可检测乳房 X 光照片上的恶性或良性病变并对…...
Python爬虫——如何使用urllib的HTTP基本库
怎样通过 urllib库 发送 HTTP 请求? urllib库主要由四个模块组成: urllib.request 打开和读取 URLurllib.error 包含 urllib.request 抛出的异常urllib.parse 用于解析 URLurllib.robotparser 用于解析 robots.txt 文件 1. 使用urllib.parse解析URL 使用urlparse(…...
OceanBase v4.3特性解析:新功能“租户克隆”的场景与应用指南
熟悉或曾用过OceanBase的朋友,对于“多租户”这一理念定不陌生。OceanBase的租户概念,与我们熟知的传统数据库实例颇为相似。举例来说,OceanBase的租户支持MySQL兼容模式,对于用户而言,选用一个MySQL兼容模式的租户&am…...
RS3236-3.3YUTDN4功能和参数介绍及PDF资料
RS3236-3.3YUTDN4功能和参数介绍及PDF资料-公司新闻-配芯易-深圳市亚泰盈科电子有限公司 品牌: RUNIC(润石) 封装: XDFN-4-EP(1x1) 描述: 带过温保护 输出类型: 固定 最大输入电压: 7.5V 输出电压: 3.3V 最大输出电流: 500mA RS3236-3.3YUTDN4 是一款低压差线性稳压器&#x…...
Vue如何引入公用方法
文章目录 1. 在全局范围内引入2. 在单文件组件中引入3. 使用Vuex或Vue Composition API4. 使用mixins5. 使用插件 1. 在全局范围内引入 在你的main.js或main.ts文件中引入并注册你的公用方法,使得它们可以在整个Vue应用中使用。 // 引入你的公用方法文件 import {…...
Java面试题:ConcurrentHashMap
ConcurrentHashMap 一种线程安全的高效Map集合 jdk1.7之前 底层采用分段的数组链表实现 一个不可扩容的数组:segment[] 数组中的每个元素都对应一个HashEntry数组用以存放数据 当放入数据时,根据key的哈希值找到对应的segment数组下标 找到下标后就会添加一个reentrantlo…...
现在闪侠惠递寄快递有福利了,千万不要因没把握住而后悔呀!
闪侠惠递平台寄快递现在真的是太便宜了,优惠价格把握不住,后悔都来不及!大家可以在闪侠惠递上面寄快递,价格真的非常优惠呢,比咱们平常寄快递的价格都优惠呢,真的,小编都亲自替大家尝试过了呢。…...
vue+ant-design+formBuiler表单构建器——技能提升——form design——亲测有效
最近看到后端同事在弄一个后台管理系统,额,前端真的是夹缝中生存啊,AI抢饭碗,后端也想干前端的活儿。。。 他用到了表单构建器,具体效果如下: 网上有很多适用于ElementUi和ant-design的form design插件,下…...
Git 如何管理标签命令(tag)
1.查看本地仓库tag --1.查看本地仓库tag UserDESKTOP-2NRT2ST MINGW64 /e/GITROOT/STARiBOSS/STARiBOSS-5GCA (gw_frontend_master) $ git tag 1stBossUpgrade V10.0.1_20220224_test V10.0.1_20220301_test tag-gwfrontend-V1.0.12-230625 tag-gw_frontend-23.08.29 tag-gw_f…...
零样本身份保持:ID-Animator引领个性化视频生成技术新前沿
在最新的研究进展中,由Xuanhua He及其团队提出的ID-Animator技术,为个性化视频生成领域带来了突破性的创新。这项技术的核心在于其零样本(zero-shot)人物视频生成方法,它允许研究者和开发者根据单一的参考面部图像生成…...
在Go语言中,可以这样使用Json
在Go语言中,处理JSON数据通常涉及编码(将Go结构体转换为JSON字符串)和解码(将JSON字符串转换为Go结构体)。Go标准库中的encoding/json包提供了这些功能。第三方插件可以使用"github.com/goccy/go-json"也有同…...
【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15
缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...
在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:
在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档,…...
剑指offer20_链表中环的入口节点
链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...
【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分
一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计,提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合:各模块职责清晰,便于独立开发…...
优选算法第十二讲:队列 + 宽搜 优先级队列
优选算法第十二讲:队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...
SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题
分区配置 (ptab.json) img 属性介绍: img 属性指定分区存放的 image 名称,指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件,则以 proj_name:binary_name 格式指定文件名, proj_name 为工程 名&…...
【Go语言基础【12】】指针:声明、取地址、解引用
文章目录 零、概述:指针 vs. 引用(类比其他语言)一、指针基础概念二、指针声明与初始化三、指针操作符1. &:取地址(拿到内存地址)2. *:解引用(拿到值) 四、空指针&am…...
虚拟电厂发展三大趋势:市场化、技术主导、车网互联
市场化:从政策驱动到多元盈利 政策全面赋能 2025年4月,国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》,首次明确虚拟电厂为“独立市场主体”,提出硬性目标:2027年全国调节能力≥2000万千瓦࿰…...
CRMEB 中 PHP 短信扩展开发:涵盖一号通、阿里云、腾讯云、创蓝
目前已有一号通短信、阿里云短信、腾讯云短信扩展 扩展入口文件 文件目录 crmeb\services\sms\Sms.php 默认驱动类型为:一号通 namespace crmeb\services\sms;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use crmeb\services\sms\…...
面试高频问题
文章目录 🚀 消息队列核心技术揭秘:从入门到秒杀面试官1️⃣ Kafka为何能"吞云吐雾"?性能背后的秘密1.1 顺序写入与零拷贝:性能的双引擎1.2 分区并行:数据的"八车道高速公路"1.3 页缓存与批量处理…...
