ObjectProvider学习

简介

ObjectProvider 是 Spring Framework 5.0 之后引入的一个新接口,它提供了一个灵活的方式来访问由 Spring 容器管理的 Bean。ObjectProvider 提供了一种更加类型安全的方式来查找和注入依赖项,同时还支持 Null 值的处理以及延迟初始化。
ObjectProvider 的一个主要优点是它支持延迟初始化。通过 getIfAvailableLazy() 方法,你可以获取一个懒加载的 Iterable,这意味着只有在迭代时才会触发 Bean 的初始化。
在 Spring 的配置和编程模型中,ObjectProvider 可以用于更灵活地处理依赖注入,特别是在处理可选的、延迟初始化的或条件性的依赖时。

源码

public interface ObjectProvider<T> extends ObjectFactory<T>, Iterable<T> {/*** 获取bean*/T getObject(Object... args) throws BeansException;/*** 如果容器中有一个可用的 Bean,则返回它,否则返回 null*/@NullableT getIfAvailable() throws BeansException;/*** 同上*/default T getIfAvailable(Supplier<T> defaultSupplier) throws BeansException {T dependency = getIfAvailable();return (dependency != null ? dependency : defaultSupplier.get());}/*** 判断容器中是否存在一个可用的bean*/default void ifAvailable(Consumer<T> dependencyConsumer) throws BeansException {T dependency = getIfAvailable();if (dependency != null) {dependencyConsumer.accept(dependency);}}/*** 如果容器中只有一个匹配的 Bean,则返回它;如果有多个匹配的 Bean,则抛出异常。*/@NullableT getIfUnique() throws BeansException;/*** 同上*/default T getIfUnique(Supplier<T> defaultSupplier) throws BeansException {T dependency = getIfUnique();return (dependency != null ? dependency : defaultSupplier.get());}/***判断是否是唯一*/default void ifUnique(Consumer<T> dependencyConsumer) throws BeansException {T dependency = getIfUnique();if (dependency != null) {dependencyConsumer.accept(dependency);}}/*** 获取迭代bean的迭代器*/@Overridedefault Iterator<T> iterator() {return stream().iterator();}/***获取bean的流*/default Stream<T> stream() {throw new UnsupportedOperationException("Multi element access not supported");}/*** 获取排序的流*/default Stream<T> orderedStream() {throw new UnsupportedOperationException("Ordered element access not supported");}}

示例

import org.springframework.beans.factory.ObjectProvider;  
import org.springframework.stereotype.Component;  @Component  
public class MyComponent {  private final ObjectProvider<OptionalDependency> optionalDependencyProvider;  public MyComponent(ObjectProvider<OptionalDependency> optionalDependencyProvider) {  this.optionalDependencyProvider = optionalDependencyProvider;  }  public void doSomething() {  OptionalDependency optionalDependency = optionalDependencyProvider.getIfAvailable();  if (optionalDependency != null) {  // 使用 optionalDependency  }  }  
}

在这个例子中,OptionalDependency 是一个可选的依赖项,MyComponent 通过 ObjectProvider 注入它,并使用 getIfAvailable() 方法在运行时检查它是否存在。如果 OptionalDependency Bean 在容器中可用,那么它将被注入并使用;否则,getIfAvailable() 将返回 null,并且 MyComponent 可以继续正常工作,而不需要这个依赖项。

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

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

相关文章

Window部署Jaeger

参考&#xff1a;windows安装使用jaeger链路追踪_windows安装jaeger-CSDN博客 下载&#xff1a;Releases jaegertracing/jaeger GitHub Jaeger – Download Jaeger 目录 1、安装nssm 2、安装运行 elasticsearch 3、安装运行 3.1部署JaegerAgent 3.2部署JaegerCollec…

【全志D1-H 哪吒开发板】Debian系统安装调教和点灯指南

全志D1-H开发板【哪吒】使用Deabian系统入门 特别说明&#xff1a; 因为涉及到操作较多&#xff0c;博文可能会导致格式丢失 其中内容&#xff0c;会根据后续使用做优化调整 目录&#xff1a; 参考资料固件烧录启动调教点灯问题 〇、参考资料 官方资料 开发板-D1开发板【…

C++:函数模板整理

函数模板: 找到函数相同的实现思路&#xff0c;区别于函数的参数类型。 使用函数模板使得函数可容纳不同类型的参数实现函数功能&#xff0c;而不是当类型不同时便编译大量类型不同的函数&#xff0c;产生大量重复代码和内存占用 函数模板格式&#xff1a; template<typ…

[Vulnhub]靶场 Red

kali:192.168.56.104 主机发现 arp-scan -l # arp-scan -l Interface: eth0, type: EN10MB, MAC: 00:0c:29:d2:e0:49, IPv4: 192.168.56.104 Starting arp-scan 1.10.0 with 256 hosts (https://github.com/royhills/arp-scan) 192.168.56.1 …

ARM64汇编02 - 寄存器与指令基本格式

最近的文章可能会有较多修改&#xff0c;请关注博客哦 异常级别 ARMv8处理器支持4种异常等级&#xff08;Exception Level&#xff0c;EL&#xff09;。 EL0 为非特权模式&#xff0c;用于运行应用程序&#xff0c;其他资源访问受限&#xff0c;权限不够。 EL1 为特权模式&…

【王道操作系统】ch1计算机系统概述-06虚拟机

文章目录 【王道操作系统】ch1计算机系统概述-06虚拟机01传统计算机02虚拟机的基本概念&#xff08;1&#xff09;第一类虚拟机管理程序&#xff08;2&#xff09; 第二类虚拟机管理程序&#xff08;3&#xff09; 两类虚拟机管理程序的对比 【王道操作系统】ch1计算机系统概述…

效果炸裂、刷爆各大视频网站的EMO到底是怎么做到的?

文章链接&#xff1a;https://arxiv.org/abs/2402.17485 今天分享的工作是刷爆各大视频平台的EMO的背后的工作原理。提出的初衷是着手解决增强发言者的头部特写视频生成中的现实感和表现力的挑战&#xff0c;重点关注音频提示与面部动作之间的动态和微妙关系。传统技术具有局限…

【HarmonyOS】鸿蒙开发之Stage模型-UIAbility的启动模式——第4.4章

UIAbi lity的启动模式简介 一共有四种:singleton,standard,specified,multion。在项目目录的:src/main/module.json5。默认开启模式为singleton(单例模式)。如下图 singleton&#xff08;单实例模式&#xff09;启动模式 每个UIAbility只存在唯一实例。任务列表中只会存在一…

测试管理进阶 | 量力而行:避免成为替罪羊

职场中,我们常常面临是否帮助他人的抉择。尽管善良是美德,但过度的好人卡可能会给自己带来麻烦。本文将探讨如何在职场中量力而行,避免成为替罪羊,以及如何保持高效和合理的职责划分。 我们在工作中常常会遇到一些需要帮助他人的情况,作为团队的一员,我们希望能够积极地协…

Linux运维_Bash脚本_编译安装libGD-2.3.3

Linux运维_Bash脚本_编译安装libGD-2.3.3 Bash (Bourne Again Shell) 是一个解释器&#xff0c;负责处理 Unix 系统命令行上的命令。它是由 Brian Fox 编写的免费软件&#xff0c;并于 1989 年发布的免费软件&#xff0c;作为 Sh (Bourne Shell) 的替代品。 您可以在 Linux 和…

六、继承(一)

1 继承的引入 以往我们想分别实现描述学生、老师的类&#xff0c;可能会这样子做&#xff1a; class Student {string _name;string _number;int _tel;int id;string _address;int _age; }; class Teacher {string _name;int _level;int _tel;int id;string _address;int _ag…

【归并排序】 详细解析 动图演示 逐图解析 洛谷P1177【模板】排序 sort【快速排序】

文章目录 归并排序1.归并排序的复杂度分析2.细节解释3.归并排序动图演示3(1) 我们的拆分过程如下↓ 4.code↓ 洛谷P1177【模板】排序数据规模与约定code&#xff08;归并排序&#xff09;↓code&#xff08;sort排序【快速排序】&#xff09; 完结撒花(&#xffe3;▽&#xff…

阅读笔记 | REFORMER: THE EFFICIENT TRANSFORMER

阅读论文&#xff1a; Kitaev, Nikita, Łukasz Kaiser, and Anselm Levskaya. “Reformer: The efficient transformer.” arXiv preprint arXiv:2001.04451 (2020). 背景与动机 这篇论文发表较早&#xff0c;主要关注Transformer的效率问题。标准的Transformer模型在许多自然…

数据中台:数字中国战略关键技术实施

这里写目录标题 前言为何要建设数据中台数据中台建设痛点数据中台学习资料聚焦前沿&#xff0c;方法论体系更新与时俱进&#xff0c;紧跟时代热点深入6大行业&#xff0c;提炼实践精华大咖推荐&#xff0c;数字化转型必备案头书 前言 在数字中国这一国家战略的牵引下&#xff0…

测试基础|质量保障体系从1到N的思考

在2023年,重点构建了团队的质量保障体系,基本完成了从0到1的过程积累,也在多个不同的场合做了相关的分享,收获了很多同行给的建议和意见。今年的首个工作目标是把这套质量保障体系运营好,去覆盖更多的团队,完成从1到N的过程,让更多的团队从这个质量体系中获益,保障基本…

Node插件开发(1)-快速入门

在使用Electron开发客户端时&#xff0c;如果现有Node模块所提供的功能无法满足需求&#xff0c;我们可以使用C开发自定义的Node模块&#xff0c;也称插件&#xff08;addon&#xff09;。 Node.js插件的扩展名为.node&#xff0c;是二进制文件&#xff0c;其本质上是动态链接…

基于springboot+vue的响应式企业员工绩效考评系统(源码+论文)

文章目录 前言 一、功能设计 1 普通员工功能 2 主管功能 3 系统管理员功能 4 评分标准功能 5 PC端与手机端 6 制图 二、功能实现 普通员工 1普通员工登录 2公告板块 3日志板块 主管 1主管登录 2公告板块 3日志板块 4绩效评分板块 5个人信息板块 系统管理员…

TypeScript 日期格式化工具方法

工具方法 创建工具文件&#xff1a;util.ts /*** 获取时间并格式化函数* param M 格式模板 如: YYYY-MM-DD ...* param Time 可选传入时间参数 默认为 Now*/ export const getFormatDate (M: string, Time: Date | null | string | number null) > {let date: Date Tim…

在 Linux 环境下安装 Kibana

目录 一、Kibana 是什么 二、在 Linux 环境下安装 Kibana 1、下载安装包 2、解压 3、修改 Kibana的配置文件 config/kibana.yml 4、启动 5、浏览器登录 Kibana 6、测试查询 一、Kibana 是什么 Kibana 是通向 Elastic 产品集的窗口。 它可以在 Elasticsearch 中对数据进…

品牌推广的两种飞轮:非酋飞轮与欧皇飞轮

在品牌推广的世界里&#xff0c;存在着两种截然不同的飞轮效应&#xff0c;我们称之为“非酋飞轮”与“欧皇飞轮”。这两种飞轮象征着品牌发展的两种不同路径和策略&#xff0c;而迅腾文化则以其独特的“繁”的原则&#xff0c;巧妙地将这两种飞轮结合&#xff0c;助力品牌形成…