深度解读:Spring.3版本自动装配机制的演变与实践

news/2024/11/18 5:45:21/文章来源:https://www.cnblogs.com/guoxiaoyu/p/18384642

前言

今天,我们将开启对Spring-AI系列源码的讲解。请大家不急不躁,我会逐步深入,每次专注于一个知识点,以防让人感到困惑。

首先,源码的讨论自然离不开自动装配。有人可能会问,之前已经讲解过这个内容了,为什么还要再谈一次?这是因为自Spring Boot 3.3.x版本以来,自动装配的机制发生了一些变化。尽管如此,凭借我们已具备的源码阅读能力,今天我们将简单回顾一下新版Spring如何处理自动装配的问题。毕竟,随着版本的不断升级,我们必须适应新的机制,避免仍用旧有的思维去解读源码。

版本依赖

要深入探索Spring-AI,首先需要配置多个关键依赖。以下是必不可少的核心依赖:

<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.3.1</version><relativePath/> <!-- lookup parent from repository -->
</parent>
<dependency> <groupId>org.springframework.ai</groupId><artifactId>spring-ai-zhipuai-spring-boot-starter</artifactId><version>1.0.0-M2</version>
</dependency>
<dependency> <groupId>org.springframework.ai</groupId><artifactId>spring-ai-bom</artifactId><version>1.0.0-M2</version><type>pom</type><scope>import</scope>
</dependency>

在完成引入之后,我们便能够顺畅地查看源码逻辑了。同时,请务必下载相关的文档资料,以便更好地理解和分析。

自动装配

之前我们已讨论过,SpringBoot的自动装配机制默认查找的是包内的META-INF/spring.factories文件。以下展示的是早期版本的装配源码,敬请留意。

protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {List<String> configurations = SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(),getBeanClassLoader());Assert.notEmpty(configurations, "No auto configuration classes found in META-INF/spring.factories. If you "+ "are using a custom packaging, make sure that file is correct.");return configurations;
}

在此,loadFactoryNames 方法会去查找 META-INF/spring.factories 文件。然而,当我查找自动装配的源码时,费了很大劲却未能找到这个文件。

image

这显然存在问题,第一步就陷入了困境。因此,我重新回到原点,重新查找了自动装配的源码。这一次,我更换了检查的文件,以下是相关的源码:

protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {List<String> configurations = ImportCandidates.load(AutoConfiguration.class, getBeanClassLoader()).getCandidates();Assert.notEmpty(configurations,"No auto configuration classes found in "+ "META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports. If you "+ "are using a custom packaging, make sure that file is correct.");return configurations;
}

最终,我发现了问题的根源。原来这里更改为 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 文件。至此,自动装配机制中又新增了一个需要记住的文件名称。所幸,这个名称也并不难以记忆。接下来查看了一下,发现实际内容与之前的文件相似。

image

好的,装配的准备工作已经充分完成。接下来的章节将深入探讨更为细致的内容。

总结

在今天的讲解中,我们从Spring-AI的源码出发,逐步解构了自动装配的演变与实践。虽然自动装配的核心概念自以往并无太大改变,但Spring Boot 3.3.x版本带来的机制调整,确实值得我们重新审视。通过回顾新版的自动装配实现方式,我们不仅加深了对新机制的理解,也为后续的源码分析奠定了坚实的基础。

随着版本的迭代,保持对新技术的敏锐洞察,将是我们不断探索与进步的关键。希望大家能够跟随我们的步伐,深入领悟每一个知识点,最终在源代码的浩瀚宇宙中找到属于自己的那一片星辰。


我是努力的小雨,一名 Java 服务端码农,潜心研究着 AI 技术的奥秘。我热爱技术交流与分享,对开源社区充满热情。同时也是一位腾讯云创作之星、阿里云专家博主、华为云云享专家、掘金优秀作者。

💡 我将不吝分享我在技术道路上的个人探索与经验,希望能为你的学习与成长带来一些启发与帮助。

🌟 欢迎关注努力的小雨!🌟

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

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

相关文章

Qt自定义插件plugin的开发和调用

1.需求描述 设备管理组件保存了设备信息和通道信息到sqlite数据库,其他组件也想要访问这个数据库中的内容;需要开发一个自定义插件,用于提供接口给其他组件访问数据库;开发环境vs2015+Qt5.9.6 2.插件介绍 插件主要面向接口编程,通过接口实现功能的扩展,而不需要访问.lib文…

SCM信道模型和SCME信道模型的matlab特性仿真,对比空间相关性,时间相关性,频率相关性

1.算法仿真效果 matlab2022a仿真结果如下(完整代码运行后无水印): 由仿真结果可以看出:信道时间相关性随着时间间隔的增大而减小,同一个天线间隔下,宏小区与微小区的间相关性相同,因为这两种场景的AOA产生方法相同,也反映出该信道模型不够准确。同理,频率相关性,空间…

升压斩波电路的simulink建模与仿真

1.课题概述 升压斩波电路的simulink建模与仿真,通过双闭环结构实现电池,点击的控制。2.系统仿真结果3.核心程序与模型 版本:MATLAB2022a 4.系统原理简介升压斩波电路(Boost Chopper Circuit)是一种电力电子转换电路,主要用于将输入直流电压升高到更高的直流电压水平。该电…

代理工具

nc 简介 Netcat是一个简单的Unix工具,用于在TCP或UDP协议上读取和写入数据。由于其简单、灵活的特性,它经常被用于网络调试或在各种网络脚本中。 TCP协议 概述 TCP(传输控制协议)是一种面向连接的协议,用于在网络上可靠地传输数据。它提供了一种可靠的、有序的、基于字节流…

Powershell 重新排列去重 Windows环境变量

最近乱搞环境变量,然后有些重复了,遂写个脚本去重下排序下。 环境变量有长度限制,如果超出了,比如SqlServer相关的,将共同路径单独搞个变量声明下,比如将其路径手动替换成如下,可大幅压缩变量长度但是,Powershell脚本在获取环境变量时又会将这些恢复成原路径,建议点击…

Powershell 重新排列 Windows环境变量

最近乱搞环境变量,然后有些重复了,遂写个脚本去重下排序下。 环境变量有长度限制,如果超出了,比如SqlServer相关的,将共同路径单独搞个变量声明下,比如将其路径手动替换成如下,可大幅压缩变量长度但是,Powershell脚本在获取环境变量时又会将这些恢复成原路径,建议点击…

英文网站文档-翻译

英文网站文档-翻译 背景: 遇到一些英文文档,需要本地制作成文档查看,且需要改成中文 ‍ 步骤找到应用软件 批量下载文档 执行翻译‍ 涉及到的工具: 1. 整站下载软件:sitSucker(mac 版本) ​​ ‍ 附:一批整站下载工具(下载神器) ‍ ‍ 2. 批量翻译脚本工具 ​​ ‍ 按…

音频转换芯片DP7344兼容CS4344双通道24位DA转换器

产品简介DP7344 是一款完整的 2 通道输出数模转换芯片,内含插值滤波器、Multi-Bit 数模转换器、输出模拟滤波器,并支持大部分的音频数据格式。DP7344 基于一个带线性模拟低通滤波器的四阶 Multi-BitΔ∑调制器,自动检测信号频率和主时钟频率,在 2KHz 和 200KHz 之间自动调节…

45岁大龄程序员自述:我居然还苟在程序人生里,但是已经难以为继

世界那么大,我想去看看...记不清好久没来写随笔发水文吐槽了,这篇文章本来是想在园子里首发的,结果鬼使神差发在了头条里面。这起因就是好 (45岁大龄程序员自述:我居然还苟在程序人生里,但是已经难以为继)原文不会打歌么学打歌阿哥怎摆你怎摆,大江大海江大海 ... 瞧,这个…

【YashanDB知识库】数据库获取时间和服务器时间不一致

本文转自YashanDB官网,具体内容可见[https://www.yashandb.com/newsinfo/7352662.html?templateId=1718516] 【问题分类】功能使用 【关键字】服务器时间、数据库时间 【问题描述】数据库获取的时间和服务器时间不一致。【问题原因分析】YashanDB并没有时区的概念,数据库的时…

Ubuntu 22.04 AX211 驱动 解决

官网的驱动居然只支持Linux6.10以上,但实际上并不这样? 可以去网站 https://launchpad.net/ubuntu/+source/backport-iwlwifi-dkms可以看到有一个20.04.5,点开下载update版本就好了 下载后,在对应文件夹里打开终端,输入sudo dpkg -i backport,按tab补全 它会先删除当前的网…

PbootCMS留言自定义表单怎么调用

在 PBootCMS 中,你可以通过自定义表单和标签来实现留言功能。以下是详细的步骤和示例代码,帮助你在全站任意地方使用留言表单和留言记录列表。 1. 留言提交表单 示例代码<form action="{pboot:msgaction}" method="post">联系人:<input type=&…