今天看一个新项目的代码, 对里面ServiceLocatorFactoryBean的使用不太明白, 便研究了一番。
首先ServiceLocatorFactoryBean的使用场景是这样的, 如果你有一个对象是从spring的beanfactory拿出来,spring的bean一般分为singleton和prototype, singleton是整个spring容器中只有一个实例,prototype是每次注入的时候new一个新实例。但注入一般是注入到对象的属性中,那对于一个对象一般只会注入一次。
假如我每次call一个方法的时候希望都使用的是新的实例, 这时就要靠ServiceLocatorFactoryBean出场了。
官方文档是这样写的
“They will typically be used for prototype beans, i.e. for factory methods that are supposed to return a new instance for each call. ”
具体用法是这样的
首先定义一个接口用来创建之后要使用的目标对象IPhase
interface IPhaseFactory { IPhase getPhase(String name); }
然后设置工厂对象,传入这个接口
<beans:bean class="org.springframework.beans.factory.config.ServiceLocatorFactoryBean" id="phaseFactory"> <beans:property name="serviceLocatorInterface" value="com.lich.IPhaseFactory"/> </beans:bean>
在具体要使用IPhase的对象的类里面设置工厂bean
class PhaseBuilder { @Inject private IPhaseFactory phaseFactory; IPhase build(String name) { IPhase phase = phaseFactory.getPhase(name);//这里每次拿到的就是新的对象了 return phase; }
看代码时这里有个困扰我的问题是 IPhaseFactory接口, 项目代码里面是没有实现类的, spring是在运行时动态代理生成了一个实现类, 那么这里就奇怪了,它怎么知道要用什么样的逻辑来返回我要的那个对象呢,比如 IPhase 接口下面有很多实现类,它怎么知道是哪一个呢?
看下ServiceLocatorFactoryBean类的源码就知道了
private Object invokeServiceLocatorMethod(Method method, Object[] args) throws Exception { Class serviceLocatorMethodReturnType = getServiceLocatorMethodReturnType(method); try { String beanName = tryGetBeanName(args); if (StringUtils.hasLength(beanName)) { // Service locator for a specific bean name return beanFactory.getBean(beanName, serviceLocatorMethodReturnType); } else { // Service locator for a bean type return beanFactory.getBean(serviceLocatorMethodReturnType); } } } private String tryGetBeanName(Object[] args) { String beanName = ""; if (args != null && args.length == 1 && args[0] != null) { beanName = args[0].toString(); } // Look for explicit serviceId-to-beanName mappings. if (serviceMappings != null) { String mappedName = serviceMappings.getProperty(beanName); if (mappedName != null) { beanName = mappedName; } } return beanName; }
上面的代码中会测试着使用接口方法中的参数作为bean的name来去beanfactory里面找, 如果接口方法没有参数,
// Service locator for a specific bean name
return beanFactory.getBean(beanName, serviceLocatorMethodReturnType);
就会使用返回对象的类型来找
// Service locator for a bean type
return beanFactory.getBean(serviceLocatorMethodReturnType);
那么在我们的列子中就是 用参数中的name来找了
IPhase getPhase(String name);
比如下面的实现类
@Component("DataPersistPhase") @Prototype class DataPersistPhase implements IPhase
相关推荐
FatoryDesign-Springboot-Batch1 该设计是使用ServiceLocatorFactoryBean实现的。 当我们有多个接口实现并想在运行时创建bean时,这种方法很方便。 创建一个接口----将由服务实现。 **确保您具有通用类型方法...
All Classes AbstractAdvisorAutoProxyCreator AbstractApplicationContext AbstractApplicationEventMulticaster AbstractAspectJAdvice AbstractAspectJAdvisorFactory AbstractAspectJAdvisorFactory....
推荐了国内外对推荐系统的讲解相关资源
全渠道电商平台业务中台解决方案.pptx
云计算企业私有云平台建设方案.pptx
本代码是基于python pytorch环境安装的。 下载本代码后,有个requirement.txt文本,里面介绍了如何安装环境,环境需要自行配置。 或可直接参考下面博文进行环境安装。 https://blog.csdn.net/no_work/article/details/139246467 如果实在不会安装的,可以直接下载免安装环境包,有偿的哦 https://download.csdn.net/download/qq_34904125/89365780 安装好环境之后, 代码需要依次运行 01数据集文本生成制作.py 02深度学习模型训练.py 和03pyqt_ui界面.py 数据集文件夹存放了本次识别的各个类别图片。 本代码对数据集进行了预处理,包括通过在较短边增加灰边,使得图片变为正方形(如果图片原本就是正方形则不会增加灰边),和旋转角度,来扩增增强数据集, 运行01数据集文本制作.py文件,会就读取数据集下每个类别文件中的图片路径和对应的标签 运行02深度学习模型训练.py就会将txt文本中记录的训练集和验证集进行读取训练,训练好后会保存模型在本地
尺寸与分辨率:该显示屏的尺寸为0.96英寸,常见分辨率为128x64像素,意味着横向有128个像素点,纵向有64个像素点。这种分辨率足以显示基本信息和简单的图形。 显示技术:OLED(有机发光二极管)技术使得每个像素都能自发光,不需要背光源,因此对比度高、色彩鲜艳、视角宽广,且在低亮度环境下表现更佳,同时能实现更低的功耗。 接口类型:这种显示屏通常支持I²C(IIC)和SPI两种通信接口,有些型号可能还支持8080或6800并行接口。I²C接口因其简单且仅需两根数据线(SCL和SDA)而广受欢迎,适用于降低硬件复杂度和节省引脚资源。 驱动IC:常见的驱动芯片为SSD1306,它负责控制显示屏的图像显示,支持不同显示模式和刷新频率的设置。 物理接口:根据型号不同,可能有4针(I²C接口)或7针(SPI接口)的物理连接器。 颜色选项:虽然大多数0.96寸OLED屏为单色(通常是白色或蓝色),但也有双色版本,如黄蓝双色,其中屏幕的一部分显示黄色,另一部分显示蓝色。
2024年欧洲高端家用P1.29 LED显示屏市场主要企业市场占有率及排名
5G智慧校园顶层设计方案.pptx
介绍了通过引进 ActiveX控件 MSComm ,在 Delphi 6. 0 编程环境下 ,实现上位机与 Omron C200H PLC串行通信的一般方法 ,并给出了工程实例。该方法简单可靠、便于移植、实用性强 ,在工业控制中有着广泛的用途。
程序设计训练之 Rust 编程语言 第四讲:泛型、特型与生命周期
山寨版的神州数码802.1x认证supplicant,基于pcap库的C语言的跨平台的原生客户端。
数字乡村建设方案.pptx
基于CRT(远程访问终端)+ARM(GEC)+Linux+C语言的视频监控系统
建筑结构水电欧式6套(14.5x20.2)\施工图\A型施工图-建筑-空施00.dwg
该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。
21121344 马丽娟.doc
C++与操作系统等面试题63
【工具模型】麦肯锡咨询师常用模型.pptx