深入探究 Spring 依赖查找:全面指南

依赖查找是 Spring 控制反转(IoC)容器的基础概念之一。与依赖注入的被动方式不同,依赖查找是一种主动或手动获取依赖的方式,通常依赖于容器或标准 API 的实现。在这篇博客中,我们将深入探讨 Spring 中的各种依赖查找类型、相关 API、使用场景,以及安全性与异常处理等注意事项。


什么是依赖查找?

在 Spring 中,依赖查找指的是通过编程方式从 IoC 容器中主动获取 Bean(由容器管理的对象)的过程。与依赖注入(由容器自动提供依赖)不同,依赖查找允许开发者在需要时手动控制 Bean 的检索。这种方式在需要动态确定依赖或处理可选 Bean 的场景中尤为实用。

Spring 的依赖查找大致可以分为以下几类:

  • 根据 Bean 名称查找
  • 根据 Bean 类型查找
  • 根据 Bean 名称 + 类型查找
  • 根据 Java 注解查找

此外,根据查找的 Bean 是单一对象还是集合对象,以及是否需要延迟查找,Spring 提供了不同的 API 支持。


单一类型依赖查找

单一类型依赖查找主要通过 BeanFactory 接口实现。以下是具体的查找方式和相关 API:

根据 Bean 名称查找

  • getBean(String): 通过 Bean 名称获取实例。
  • Spring 2.5 增强: getBean(String, Object...),支持覆盖默认构造参数。

根据 Bean 类型查找

  • 实时查找:
    • Spring 3.0: getBean(Class),根据类型获取 Bean。
    • Spring 4.1: getBean(Class, Object...),支持构造参数。
  • 延迟查找(Spring 5.1):
    • getBeanProvider(Class): 返回一个延迟加载的 Bean 提供者。
    • getBeanProvider(ResolvableType): 支持更复杂的类型解析。

根据 Bean 名称 + 类型查找

  • getBean(String, Class): 结合名称和类型,确保类型安全。

集合类型依赖查找

集合类型依赖查找通过 ListableBeanFactory 接口实现,适用于获取某一类型的所有 Bean。

根据 Bean 类型查找

  • 获取 Bean 名称列表:
    • getBeanNamesForType(Class): 返回匹配类型的 Bean 名称。
    • Spring 4.2: getBeanNamesForType(ResolvableType),支持更精确的类型匹配。
  • 获取 Bean 实例列表:
    • getBeansOfType(Class): 返回类型匹配的 Bean 实例集合及其重载方法。

根据注解查找

  • Spring 3.0:
    • getBeanNamesForAnnotation(Class<? extends Annotation>): 获取带有指定注解的 Bean 名称。
    • getBeansWithAnnotation(Class<? extends Annotation>): 获取带有指定注解的 Bean 实例。
    • findAnnotationOnBean(String, Class<? extends Annotation>): 获取特定 Bean 上的注解实例。

层次性依赖查找

层次性依赖查找通过 HierarchicalBeanFactory 接口实现,适用于具有父子关系的容器。

  • 获取父容器: getParentBeanFactory()
  • 层次性查找:
    • 根据名称: 通过 containsLocalBean 方法判断 Bean 是否存在于当前容器。
    • 根据类型:
      • 单一类型: BeanFactoryUtils#beanOfType
      • 集合类型: BeanFactoryUtils#beansOfTypeIncludingAncestors
    • 根据注解: BeanFactoryUtils#beanNamesForTypeIncludingAncestors

延迟依赖查找

延迟依赖查找通过以下接口实现,特别适用于避免立即加载 Bean 的场景:

  • ObjectFactory: 基础延迟加载接口。
  • ObjectProvider(Spring 5 扩展):
    • getIfAvailable(Supplier): 如果 Bean 可用则返回,否则使用默认值。
    • ifAvailable(Consumer): 如果 Bean 存在则执行操作。
    • stream(): 支持流式操作,处理集合类型。

安全依赖查找

并非所有依赖查找方式都是安全的。以下是常见查找方式的安全性对比:

依赖查找类型代表实现是否安全
单一类型查找BeanFactory#getBean
ObjectFactory#getObject
ObjectProvider#getIfAvailable
集合类型查找ListableBeanFactory#getBeansOfType
ObjectProvider#stream

注意:层次性查找的安全性取决于其底层单一或集合类型的实现。


内建可查找的依赖

Spring 上下文(AbstractApplicationContext)内置了一些可直接查找的依赖:

Bean 名称实例类型使用场景
environmentEnvironment外部化配置和 Profiles
systemPropertiesjava.util.PropertiesJava 系统属性
systemEnvironmentjava.util.Map操作系统环境变量
messageSourceMessageSource国际化文案
lifecycleProcessorLifecycleProcessorLifecycle Bean 处理
applicationEventMulticasterApplicationEventMulticasterSpring 事件广播

此外,在注解驱动的 Spring 应用中,还包括以下内置 Bean(部分示例):

Bean 名称实例类型使用场景
internalConfigurationAnnotationProcessorConfigurationClassPostProcessor处理 Spring 配置类
internalAutowiredAnnotationProcessorAutowiredAnnotationBeanPostProcessor处理 @Autowired@Value 注解
internalEventListenerProcessorEventListenerMethodProcessor处理 @EventListener 事件监听方法

依赖查找中的常见异常

依赖查找可能触发 BeansException 的子类异常,以下是典型场景:

异常类型触发条件场景举例
NoSuchBeanDefinitionExceptionBean 不存在于容器中BeanFactory#getBean
NoUniqueBeanDefinitionException类型查找时存在多个 Bean 实例BeanFactory#getBean(Class)
BeanInstantiationExceptionBean 类型为抽象类或接口BeanFactory#getBean
BeanCreationExceptionBean 初始化失败初始化方法抛出异常
BeanDefinitionStoreExceptionBean 定义元信息非法XML 配置资源无法解析

总结

Spring 的依赖查找提供了灵活的方式来获取 IoC 容器中的 Bean,从单一类型到集合类型,从实时查找至延迟加载,涵盖了多种开发场景。理解这些 API 的功能和限制(如安全性、异常处理)对于编写健壮的 Spring 应用至关重要。无论是通过名称、类型还是注解查找,Spring 都为开发者提供了强大的工具来管理依赖。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

贪心算法--

1.柠檬水找零 link:860. 柠檬水找零 - 力扣&#xff08;LeetCode&#xff09; code class Solution { public:bool lemonadeChange(vector<int>& bills) {// 贪心算法&#xff0c; 优先花出大面额bill&#xff0c; 尽可能保护小面额billint five 0, ten 0;// 不…

[machine learning] DP(Data Parallel) vs DDP(Distributed Data Parallel)

DP和DDP是并行训练的两种方法&#xff0c;本文简单介绍它们两者的区别。 一、DP (Data Parallel) DP是单进程&#xff0c;多线程的&#xff0c;每个线程负责一个GPU&#xff0c;它只适用于一台机器。DP训练的流程如下图所示(图片转载自&#xff1a;https://medium.com/mlshar…

vue+dhtmlx-gantt 实现甘特图-快速入门【甘特图】

文章目录 一、前言二、使用说明2.1 引入依赖2.2 引入组件2.3 引入dhtmlx-gantt2.4 甘特图数据配置2.5 初始化配置 三、代码示例3.1 Vue2完整示例3.2 Vue3 完整示例 四、效果图 一、前言 dhtmlxGantt 是一款功能强大的甘特图组件&#xff0c;支持 Vue 3 集成。它提供了丰富的功…

CI/CD—Jenkins配置Maven+GitLab自动构建jar包

一、安装Maven插件通过Maven构建项目 1、在Jenkins上安装Maven Integration plugin插件 2、创建一个maven项目 2.1、填写构建的名称和描述等 2.2、填写连接git的url 报错&#xff1a;无法连接仓库&#xff1a;Error performing git command: git ls-remote -h http://192.168.…

基于DeepSeek的智慧医药系统(源码+部署教程)

运行环境 智慧医药系统运行环境如下&#xff1a; 前端&#xff1a; HTMLCSS后端&#xff1a;Java AIGCDeepseekIDE工具&#xff1a;IDEA技术栈&#xff1a;Springboot HTMLCSS MySQL 主要角色 智慧医药系统主要分为两个角色。 游客 尚未进行注册和登录。具备登录注册、…

java BCC异或校验例子

需求 对一个十六进制的字符串进行BCC校验 方法 private static String XORCheck(String rawMsg) {// 16进制字符串需要转成10进制数组进行校验&#xff0c;然后再返回16进制字符串用于与原来的字符匹配byte[] bytes HexDumpMsgFormat.hexStr2DesBytes(rawMsg);return BytesUt…

保安员考试:巧用记忆术,攻克理论知识堡垒

保安员考试&#xff1a;巧用记忆术&#xff0c;攻克理论知识堡垒 一、构建知识框架&#xff0c;提纲挈领 保安员考试理论知识繁杂&#xff0c;涵盖保安基础理论、法律常识等多方面。首先要依据考试大纲&#xff0c;梳理出清晰的知识框架。以保安基础理论为例&#xff0c;将保安…

游戏引擎学习第145天

仓库:https://gitee.com/mrxiao_com/2d_game_3 今天的计划 目前&#xff0c;我们正在完成遗留的工作。当时我们已经将声音混合器&#xff08;sound mixer&#xff09;集成到了 SIMD 中&#xff0c;但由于一个小插曲&#xff0c;没有及时完成循环内部的部分。这个小插曲主要是…

ForceMimic:以力为中心的模仿学习,采用力运动捕捉系统进行接触丰富的操作

25年3月来自上海交大卢策吾教授团队的论文“ForceMimic: Force-Centric Imitation Learning with Force-Motion Capture System for Contact-Rich Manipulation”。 在大多数接触丰富的操作任务中&#xff0c;人类会将随时间变化的力施加到目标物体上&#xff0c;以补偿视觉引…

ERROR:L6002U 一种解决方案

1.问题描述 前面的文章也讲到过有一次出现&#xff0c;这次再看一下为什么 打开这个文件&#xff0c;以及它的头文件 源文件报错信息&#xff1a; 2、原因查找 这是由于不同的人上传不同的工程&#xff0c;拉取更新导致的&#xff0c;可能的原因是keil文件夹的组织方式。 很…

GPU加速生信分析-宏基因组MAG去污染

Deepurify利用多模态深度语言模型来过滤污染的基因组&#xff0c;从而提高了宏基因组组装基因组&#xff08;MAGs&#xff09;的质量&#xff0c;并且可以利用GPU加速。 宏基因组组装的基因组 &#xff08;MAG&#xff09; 为使用宏基因组测序数据探索微生物暗物质提供了有价值…

AI与SEO关键词智能解析

内容概要 人工智能技术正重塑搜索引擎优化的底层逻辑&#xff0c;其核心突破体现在关键词解析维度的结构性升级。通过机器学习算法对海量搜索数据的动态学习&#xff0c;AI不仅能够识别传统TF-IDF模型中的高频词汇&#xff0c;更能捕捉语义网络中隐含的关联特征。下表展示了传…

【已解决】最新 Android Studio(2024.3.1版本)下载安装配置 图文超详细教程 手把手教你 小白

前言 设置 Android 开发环境&#xff0c;主要包括&#xff1a; 下载Java Development Kit&#xff08;JDK&#xff09;安装 Android Studio&#xff08;集成开发环境&#xff09; 下载Android SDK 一、JDK Android Studio 自带了 OpenJDK&#xff0c;通常无需额外安装。 如…

LLM中的transformer结构学习(二 完结 Multi-Head Attention、Encoder、Decoder)

文章目录 LLM中的transformer结构学习&#xff08;二 完结 Multi-Head Attention、Encoder、Decoder&#xff09;Self-Attention &#xff08;自注意力机制&#xff09;结构多头注意力 EncoderAdd & Norm 层Feed Forward 层 EncoderDecoder的第一个Multi-Head AttentionMas…

TDengine 接入帆软 BI 工具

1. 简介 帆软 BI 和 TDengine 在数据分析和可视化领域有紧密的合作关系&#xff0c;帆软是中国专业的大数据 BI 和分析平台提供商&#xff0c;其核心产品包括 FineReport 和 FineBI 等。帆软的 BI 工具广泛应用于各类企业&#xff0c;帮助用户实现数据的可视化分析、报表生成和…

【Java开发指南 | 第三十四篇】IDEA没有Java Enterprise——解决方法

读者可订阅专栏&#xff1a;Java开发指南 |【CSDN秋说】 文章目录 1、新建Java项目2、单击项目名&#xff0c;并连续按两次shift键3、在搜索栏搜索"添加框架支持"4、勾选Web应用程序5、最终界面6、添加Tomcat 1、新建Java项目 2、单击项目名&#xff0c;并连续按两次…

NET400系列协议网关技术方案

NET400系列协议网关技术方案 1. 问题背景 工业现场普遍存在多品牌设备异构通信难题&#xff1a; 协议碎片化&#xff1a;西门子&#xff08;Profinet/S7-TCP&#xff09;、罗克韦尔&#xff08;EtherNet/IP&#xff09;、三菱&#xff08;MC Protocol&#xff09;等设备协议…

如何用Kimi生成PPT?秒出PPT更高效!

做PPT是不是总是让你头疼&#xff1f;&#x1f629; 快速制作出专业的PPT&#xff0c;今天我们要推荐两款超级好用的AI工具——Kimi 和 秒出PPT&#xff01;我们来看看哪一款更适合你吧&#xff01;&#x1f680; &#x1f947; Kimi&#xff1a;让PPT制作更轻松 Kimi的生成效…

深入理解Java中的static关键字及其内存原理

static是Java中实现类级共享资源的核心修饰符&#xff0c;它突破了对象实例化的限制&#xff0c;使得变量和方法能够直接与类本身绑定。这种特性让static成为构建工具类、全局配置等场景的利器&#xff0c;但同时也带来独特的内存管理机制需要开发者关注。 static修饰成员变量…

Zemax 中的 CAD 文件性能比较

这些文件格式 STEP、IGS、SAT 和 STL 通常用于 3D 建模、CAD 和工程应用程序。STEP、IGS、SAT 和 STL 之间的主要区别在于它们如何在 CAD、工程和 3D 打印应用程序中存储和表示 3D 几何图形。 Zemax OpticStudio、STEP、IGES、SAT 和 STL 文件的性能可能会因文件类型和用例&am…