当前位置: 首页 > news >正文

Spring中ObjectProvider的妙用与实例解析

在Spring框架中,ObjectProvider是一个非常实用的接口,它可以帮助我们解决一些复杂的依赖注入问题,尤其是当我们需要注入生命周期较短的bean时。与传统的javax.inject.Provider相比,ObjectProvider在Spring 5.0中引入了许多新方法,这些方法利用了Java 8的java.util.function回调机制,使得代码更加简洁和灵活。
一、ObjectProvider的使用场景
在Spring中,我们经常会遇到需要注入原型(Prototype)作用域的bean到单例(Singleton)作用域的bean中的情况。由于原型bean每次请求都会创建一个新的实例,而单例bean在整个应用生命周期中只有一个实例,因此直接注入会导致问题。ObjectProvider提供了一种优雅的解决方案,它允许我们在需要时动态获取原型bean的实例。
二、实例解析

  1. 定义原型Bean
    首先,我们定义一个原型Bean,它的作用域为prototype,每次请求都会创建一个新的实例。
    java复制
    package com.logicbig.example;

public class MyPrototypeBean {
private String message;
public MyPrototypeBean(String message) {
this.message = message;
}
public String getMessage() {
return message;
}
}
2. 使用ObjectProvider注入原型Bean
接下来,我们在单例Bean中使用ObjectProvider来注入原型Bean。通过ObjectProvider.getIfAvailable()方法,我们可以获取原型Bean的实例,如果原型Bean未注册,则会使用默认的供应商提供的实例。
java复制
package com.logicbig.example;

import org.springframework.beans.factory.ObjectProvider;
import org.springframework.beans.factory.annotation.Autowired;

public class MySingletonBean {
@Autowired
private ObjectProvider myPrototypeBeanProvider;

public void showMessage() {MyPrototypeBean bean = myPrototypeBeanProvider.getIfAvailable(() -> new MyPrototypeBean("Default Bean"));System.out.printf("%s, prototype instance id: %s%n",bean.getMessage(), System.identityHashCode(bean));
}

}
3. 配置类与主方法
在配置类中,我们定义了原型Bean和单例Bean,并通过AnnotationConfigApplicationContext启动Spring上下文。
java复制
package com.logicbig.example;

import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;

@Configuration
public class AppConfig {
@Bean
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public MyPrototypeBean prototypeBean() {
return new MyPrototypeBean(“My Prototype Bean”);
}

@Bean
public MySingletonBean singletonBean() {return new MySingletonBean();
}public static void main(String[] args) {AnnotationConfigApplicationContext context =new AnnotationConfigApplicationContext(AppConfig.class);MySingletonBean bean = context.getBean(MySingletonBean.class);bean.showMessage();bean = context.getBean(MySingletonBean.class);bean.showMessage();
}

}
4. 输出结果
运行程序后,输出结果如下:
复制
My Prototype Bean, prototype instance id: 1341487403
My Prototype Bean, prototype instance id: 2059201215
可以看到,每次调用showMessage()方法时,都会创建一个新的原型Bean实例,这正是我们期望的行为。
三、对比与总结
如果我们将原型Bean的作用域改为singleton,则每次调用showMessage()方法时,都会使用同一个Bean实例,输出结果如下:
复制
My Prototype Bean, prototype instance id: 285891949
My Prototype Bean, prototype instance id: 285891949
此外,如果未注册原型Bean,则ObjectProvider.getIfAvailable()会使用默认的供应商提供的实例,输出结果如下:
复制
Default Bean, prototype instance id: 1936873997
Default Bean, prototype instance id: 1661918190
通过这个例子,我们可以看到ObjectProvider在处理原型Bean注入时的强大功能。它不仅解决了单例Bean与原型Bean之间的依赖问题,还提供了灵活的默认实例创建机制,使得代码更加简洁和高效。
总之,ObjectProvider是Spring框架中一个非常实用的工具,它在处理复杂的依赖注入场景时表现出色。希望这篇文章能帮助你更好地理解和使用ObjectProvider。

相关文章:

Spring中ObjectProvider的妙用与实例解析

在Spring框架中,ObjectProvider是一个非常实用的接口,它可以帮助我们解决一些复杂的依赖注入问题,尤其是当我们需要注入生命周期较短的bean时。与传统的javax.inject.Provider相比,ObjectProvider在Spring 5.0中引入了许多新方法&…...

Easy系列PLC尺寸测量功能块(激光微距应用)

激光微距仪可以测量短距离内的产品尺寸,产品规格书的测量 精度可以到0.001mm。具体需要看不同的型号。 1、激光微距仪 2、尺寸测量应用 下面我们以测量高度为例子,设计一个高度测量功能块,同时给出测量数据和合格不合格指标。 3、高度测量功能块 4、复位完成信号 5、功能…...

当卷积神经网络遇上AI编译器:TVM自动调优深度解析

从铜线到指令:硬件如何"消化"卷积 在深度学习的世界里,卷积层就像人体中的毛细血管——数量庞大且至关重要。但鲜有人知,一个简单的3x3卷积在CPU上的执行路径,堪比北京地铁线路图般复杂。 卷积的数学本质 对于输入张…...

《网络编程基础之完成端口模型》

【完成端口模型导读】完成端口模型,算得上是真正的异步网络IO模型吧,相对于其它网络IO模型,操作系统通知我们的时候,要么就是连接已经帮我建立好,客户端套接字帮我们准备好;要么就是数据已经接收完成&#…...

Axure PR 9 旋转效果 设计交互

大家好,我是大明同学。 这期内容,我们将学习Axure中的旋转效果设计与交互技巧。 旋转 创建旋转效果所需的元件 1.打开一个新的 RP 文件并在画布上打开 Page 1。 2.在元件库中拖出一个按钮元件。 创建交互 创建按钮交互状态 1.选中按钮元件&#xf…...

完美还是完成?把握好度,辨证看待

完美还是完成? 如果说之前这个答案有争议,那么现在,答案毋庸置疑 ■为什么完美大于完成 ●时间成本: 做事不仅要考虑结果,还要考虑时间和精力,要说十年磨一剑的确质量更好,但是现实没有那么多…...

C++的类Class

文章目录 一、C的struct和C的类的区别二、关于OOP三、举例:一个商品类CGoods四、构造函数和析构函数1、定义一个顺序栈2、用构造和析构代替s.init(5);和s.release();3、在不同内存区域构造对象4、深拷贝和浅拷贝5、构造函数和深拷贝的简单应用6、构造函数的初始化列…...

C++中的内存管理

学完了类与对象,这节我们来了解一下内存里的那些事 文章目录 一、C/C中的内存分布 1. 常量区(代码段) (Text Segment) 2. 静态区(数据段) (Data Segment) 3. 堆区 (Heap) 4. 栈区 (Stack) 5. 内存映射区域 (Memory-map…...

MySQL为什么默认引擎是InnoDB ?

大家好,我是锋哥。今天分享关于【MySQL为什么默认引擎是InnoDB ?】面试题。希望对大家有帮助; MySQL为什么默认引擎是InnoDB ? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 MySQL 默认引擎是 InnoDB,主要…...

ComfyUI安装调用DeepSeek——DeepSeek多模态之图形模型安装问题解决(ComfyUI-Janus-Pro)

ComfyUI 的 Janus-Pro 节点,一个统一的多模态理解和生成框架。 试用: https://huggingface.co/spaces/deepseek-ai/Janus-1.3B https://huggingface.co/spaces/deepseek-ai/Janus-Pro-7B https://huggingface.co/spaces/deepseek-ai/JanusFlow-1.3B 安装…...

电脑要使用cuda需要进行什么配置

在电脑上使用CUDA(NVIDIA的并行计算平台和API),需要进行以下配置和准备: 1. 检查NVIDIA显卡支持 确保你的电脑拥有支持CUDA的NVIDIA显卡。 可以在NVIDIA官方CUDA支持显卡列表中查看显卡型号是否支持CUDA。 2. 安装NVIDIA显卡驱动…...

利用Muduo库实现简单且健壮的Echo服务器

一、muduo网络库主要提供了两个类: TcpServer:用于编写服务器程序 TcpClient:用于编写客户端程序 二、三个重要的链接库: libmuduo_net、libmuduo_base、libpthread 三、muduo库底层就是epoll线程池,其好处是…...

Scratch 《像素战场》系列综合游戏:像素战场游戏Ⅰ~Ⅲ 介绍

资源下载 Scratch《像素战场》系列综合游戏合集:像素战场游戏Ⅰ~Ⅲ压缩包 https://download.csdn.net/download/leyang0910/90332765 游戏操作介绍 Scratch 《像素战场Ⅰ》操作规则: 这是一款与朋友一起玩的 1v1 游戏。先赢得6轮胜利! WA…...

Android学习制作app(ESP8266-01S连接-简单制作)

一、理论 部分理论见arduino学习-CSDN博客和Android Studio安装配置_android studio gradle 配置-CSDN博客 以下直接上代码和效果视频,esp01S的收发硬件代码目前没有分享,但是可以通过另一个手机网络调试助手进行模拟。也可以直接根据我的代码进行改动…...

三甲医院大型生信服务器多配置方案剖析与应用(2024版)

一、引言 1.1 研究背景与意义 在当今数智化时代,生物信息学作为一门融合生物学、计算机科学和信息技术的交叉学科,在三甲医院的科研和临床应用中占据着举足轻重的地位。随着高通量测序技术、医学影像技术等的飞速发展,生物医学数据呈爆发式…...

【Unity3D】实现横版2D游戏——单向平台(简易版)

目录 问题 项目Demo直接使用免费资源:Hero Knight - Pixel Art (Asset Store搜索) 打开Demo场景,进行如下修改,注意Tag是自定义标签SingleDirCollider using System.Collections; using System.Collections.Generic;…...

大白话讲清楚embedding原理

Embedding(嵌入)是一种将高维数据(如单词、句子、图像等)映射到低维连续向量的技术,其核心目的是通过向量表示捕捉数据之间的语义或特征关系。以下从原理、方法和应用三个方面详细解释Embedding的工作原理。 一、Embe…...

电脑优化大师-解决电脑卡顿问题

我们常常会遇到电脑运行缓慢、网速卡顿的情况,但又不知道是哪个程序在占用过多资源。这时候,一款能够实时监控网络和系统状态的工具就显得尤为重要了。今天,就来给大家介绍一款小巧实用的监控工具「TrafficMonitor」。 「TrafficMonitor 」是…...

el-table组件样式如何二次修改?

文章目录 前言一、去除全选框按钮样式二、表头颜色的修改 前言 ElementUI中的组件el-table表格组件提供了丰富的样式,有一个全选框的el-table组件,提供了全选框和多选。 一、去除全选框按钮样式 原本默认是有全选框的。假如有一些开发者,因…...

java练习(1)

两数之和(题目来自力扣) 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案,并且你不能使用两次相…...

[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?

🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里&#xf…...

51c自动驾驶~合集58

我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留,CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制(CCA-Attention),…...

脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)

一、数据处理与分析实战 (一)实时滤波与参数调整 基础滤波操作 60Hz 工频滤波:勾选界面右侧 “60Hz” 复选框,可有效抑制电网干扰(适用于北美地区,欧洲用户可调整为 50Hz)。 平滑处理&…...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合

强化学习(Reinforcement Learning, RL)是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程,然后使用强化学习的Actor-Critic机制(中文译作“知行互动”机制),逐步迭代求解…...

抖音增长新引擎:品融电商,一站式全案代运营领跑者

抖音增长新引擎:品融电商,一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中,品牌如何破浪前行?自建团队成本高、效果难控;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...

STM32标准库-DMA直接存储器存取

文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...

高危文件识别的常用算法:原理、应用与企业场景

高危文件识别的常用算法:原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件,如包含恶意代码、敏感数据或欺诈内容的文档,在企业协同办公环境中(如Teams、Google Workspace)尤为重要。结合大模型技术&…...

今日科技热点速览

🔥 今日科技热点速览 🎮 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售,主打更强图形性能与沉浸式体验,支持多模态交互,受到全球玩家热捧 。 🤖 人工智能持续突破 DeepSeek-R1&…...

【VLNs篇】07:NavRL—在动态环境中学习安全飞行

项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战,克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...

[大语言模型]在个人电脑上部署ollama 并进行管理,最后配置AI程序开发助手.

ollama官网: 下载 https://ollama.com/ 安装 查看可以使用的模型 https://ollama.com/search 例如 https://ollama.com/library/deepseek-r1/tags # deepseek-r1:7bollama pull deepseek-r1:7b改token数量为409622 16384 ollama命令说明 ollama serve #&#xff1a…...