首页 星云 工具 资源 星选 资讯 热门工具
:

PDF转图片 完全免费 小红书视频下载 无水印 抖音视频下载 无水印 数字星空

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

编程知识
2024年09月14日 11:21

前言

今天,我们将开启对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 技术的奥秘。我热爱技术交流与分享,对开源社区充满热情。同时也是一位腾讯云创作之星、阿里云专家博主、华为云云享专家、掘金优秀作者。

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

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

From:https://www.cnblogs.com/guoxiaoyu/p/18384642
本文地址: http://www.shuzixingkong.net/article/2014
0评论
提交 加载更多评论
其他文章 Go runtime 调度器精讲(五):调度策略
原创文章,欢迎转载,转载请注明出处,谢谢。 0. 前言 在 第四讲 我们介绍了 main goroutine 是如何运行的。其中针对 main goroutine 介绍了调度函数 schedule 是怎么工作的,对于整个调度器的调度策略并没有介绍,这点是不完整的,这一讲会完善调度器的调度策略部分。
Go runtime 调度器精讲(五):调度策略
Powershell 重新排列去重 Windows环境变量
最近乱搞环境变量,然后有些重复了,遂写个脚本去重下排序下。 环境变量有长度限制,如果超出了,比如SqlServer相关的,将共同路径单独搞个变量声明下,比如 将其路径手动替换成如下,可大幅压缩变量长度 但是,Powershell脚本在获取环境变量时又会将这些恢复成原路径,建议点击编辑文本,将其拷贝下
Powershell 重新排列去重 Windows环境变量 Powershell 重新排列去重 Windows环境变量
吊打面试官!业务架构的关键概念
商业模式 商业模式是帮助企业成功的“秘诀”,它通过整合企业内外部的多种要素,构建起一个全面、高效且具有独特竞争优势的运营体系。这一体系的目的是满足市场的需求,实现各利益相关者价值最大化,并确保企业的长期盈利能力。 商业模式的核心架构由三个紧密相连的环节构成:创造价值、传递价值和获取价值。 创造价值:
吊打面试官!业务架构的关键概念 吊打面试官!业务架构的关键概念 吊打面试官!业务架构的关键概念
.NET 开源的功能强大的人脸识别 API
前言 人工智能时代,人脸识别技术已成为安全验证、身份识别和用户交互的关键工具。 给大家推荐一款.NET 开源提供了强大的人脸识别 API,工具不仅易于集成,还具备高效处理能力。 本文将介绍一款如何利用这些API,为我们的项目添加智能识别的亮点。 项目介绍 GitHub 上拥有 1.2k 星标的 C#
.NET 开源的功能强大的人脸识别 API .NET 开源的功能强大的人脸识别 API .NET 开源的功能强大的人脸识别 API
推荐3款卓越的 .NET 开源搜索组件库
前言 最近有不少同学提问;.NET有哪些开源的搜索组件库可以推荐的吗?,今天大姚给大家推荐3款卓越的 .NET 开源搜索组件库,希望可以帮助到有需要的同学。 Elasticsearch .NET Elasticsearch 的 .NET 客户端为 Elasticsearch API 提供强类型请求和
推荐3款卓越的 .NET 开源搜索组件库 推荐3款卓越的 .NET 开源搜索组件库 推荐3款卓越的 .NET 开源搜索组件库
45岁大龄程序员自述:我居然还苟在程序人生里,但是已经难以为继
世界那么大,我想去看看... 原文 不会打歌么学打歌阿哥怎摆你怎摆,大江大海江大海 ... 瞧,这个中年不油腻(不油腻的原因是大叔很穷)的大叔扛着音箱出场了,其实远没有这么拉风! 今年被动看到许多不好的消息和内容:充满了“失业”,“裁员”等。一度我已经更郁郁了。所以我今天不是来搞笑的。真心希望大家能
45岁大龄程序员自述:我居然还苟在程序人生里,但是已经难以为继 45岁大龄程序员自述:我居然还苟在程序人生里,但是已经难以为继
手撸MQ消息队列——循环数组
队列是咱们开发中经常使用到的一种数据结构,它与栈的结构类似。然而栈是后进先出,而队列是先进先出,说的专业一点就是FIFO。在生活中到处都可以找到队列的,最常见的就是排队,吃饭排队,上地铁排队,其他就不过多举例了。 队列的模型 在数据结构中,和排队这种场景最像的就是数组了,所以我们的队列就用数组去实现
手撸MQ消息队列——循环数组 手撸MQ消息队列——循环数组 手撸MQ消息队列——循环数组
Nuxt Kit 自动导入功能:高效管理你的模块和组合式函数
title: Nuxt Kit 自动导入功能:高效管理你的模块和组合式函数 date: 2024/9/14 updated: 2024/9/14 author: cmdragon excerpt: 通过使用 Nuxt Kit 的自动导入功能,您可以更高效地管理和使用公共函数、组合式函数和 Vue A
Nuxt Kit 自动导入功能:高效管理你的模块和组合式函数 Nuxt Kit 自动导入功能:高效管理你的模块和组合式函数