如何使用Spring FactoryBean?

Harness设计——Anthropic实战:规划器、生成器、评估器三角色协作详解 本文探讨了如何通过多智能体架构突破AI编码的瓶颈问题。文章首先分析了当前AI编码面临的两大核心挑战:上下文窗口限制导致的连贯性丧失,以及自我评估机制缺失引发的质量判断偏差。针对这些问题,作者提出了基于生成对抗网络(GAN)灵感的解决方案,设计了三智能体系统:规划器负责需求分析,生成器执行编码任务,评估器进行质量审查。 实验表明,在前端设计任务中,通过制定可量化的评分标准(设计质量、原创性、工艺、功能性)并建立生成-评估反馈循环,能显著提升输出质量。这种架构随后被扩展到全栈开发领域,采用类似敏捷开发的&quo 阅读详情
1.概述
 
Spring bean容器中有两种bean:普通bean和工厂bean。Spring直接使用前者,而后者自 身 可以生成由框架管理的对象。
简单地说,我们可以通过实现 org.springframework.beans.factory.FactoryBean<T> 接口来构建一个工厂bean 。
 
2.工厂Bean基础
 
2.1实现一个FactoryBean

首先看看FactoryBean接口定义:

public interface FactoryBean<T> {
   T getObject() throws Exception;
   Class<T> getObjectType();
   boolean isSingleton();
}  
我们来讨论三种方法:

  • getObject() - 返回工厂生成的对象,这是Spring容器将使用的对象
  • getObjectType() - 返回此FactoryBean生成的对象的类型
  • isSingleton() - 表示此FactoryBean生成的对象是否为单例

现在,让我们来实现 FactoryBean 例子。我们将实现一个 ToolFactory,它生成类型为Tool的对象 :
public class Tool {
    private int id;
    // standard constructors, getters and setters
}  

ToolFactory如下:
public class ToolFactory implements FactoryBean<Tool> {
     
    private int factoryId;
    private int toolId;
 
    @Override
    public Tool getObject() throws Exception {
        return new Tool(toolId);
    }
 
    @Override
    public Class<?> getObjectType() {
        return Tool.class;
    }
 
    @Override
    public boolean isSingleton() {
        return false;
    }
 
    // standard setters and getters
}  
我们可以看到,ToolFactory是一个FactoryBean,它可以生成Tool对象。

2.2 基于XML的配置 使用FactoryBean
 
现在来看看如何使用我们的ToolFactory
  我们将基于 factorybean-spring-ctx.xml  开始构建一个Tool:
    
  1. <beans ...>
  2.     <bean id="tool" class="com.baeldung.factorybean.ToolFactory">
  3.         <property name="factoryId" value="9090"/>
  4.         <property name="toolId" value="1"/>
  5.     </bean>
  6. </beans>
接下来,我们可以测试Tool  对象是否正确注入:

@RunWith(SpringJUnit4ClassRunner.class)
@ ContextConfiguration ( locations  = {  "classpath:factorybean-spring-ctx.xml"  })
public class FactoryBeanXmlConfigTest {
    @Autowired
    private Tool tool;
 
    @Test
    public void testConstructWorkerByXml() {
        assertThat(tool.getId(), equalTo(1));
    }
}  

测试结果表明,我们使得 ToolFactory生成的Tool对象注入到了  Factorybean-spring-ctx.xml中配置的属性中。
试验结果还表明,Spring容器使用FactoryBean生成的对象而不是它本身用于依赖注入。

虽然Spring容器使用FactoryBean的getObject()方法的返回值作为bean,但也可以使用FactoryBean本身。
要访问FactoryBean,您只需要在bean名称之前添加一个“&”。
 
我们尝试获取工厂bean及其factoryId属性:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:factorybean-spring-ctx.xml" })
public class FactoryBeanXmlConfigTest {
 
    @Resource(name = "&tool")
    private ToolFactory toolFactory;
 
    @Test
    public void testConstructWorkerByXml() {
        assertThat(toolFactory.getFactoryId(), equalTo(9090));
    }
}  

2.3基于Java配置使用FactoryBean
 
使用 基于Java配置的 FactoryBean 与使用基于XML的配置时稍有不同,你必须显式调用的FactoryBean的getObject()方法。

我们将前一小节中的示例转换为基于Java的配置示例:
@Configuration
public class FactoryBeanAppConfig {
  
    @Bean(name = "tool")
    public ToolFactory toolFactory() {
        ToolFactory factory = new ToolFactory();
        factory.setFactoryId(7070);
        factory.setToolId(2);
        return factory;
    }
}  
然后,我们测试Tool  对象是否正确注入:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = FactoryBeanAppConfig.class)
public class FactoryBeanJavaConfigTest {
 
    @Autowired
    private Tool tool;
  
    @Resource(name = "&tool")
    private ToolFactory toolFactory;
 
    @Test
    public void testConstructWorkerByJava() {
        assertThat(tool.getId(), equalTo(2));
        assertThat(toolFactory.getFactoryId(), equalTo(7070));
    }
}  
测试结果显示与以前基于XML的配置测试有类似的效果。

3.初始化方式
 
有时我们需要在FactoryBean设置完成之后,调用getObject()方法之前执行一些操作,例如属性检查。
 我们 可以通过实现InitializingBean 接口或使用@PostConstruct 注解来实现此目的。
  有关使用这两个解决方案的更多详细信息,请参见另一篇文章:  Spring中启动时运行逻辑指南。

4. AbstractFactoryBean
 
Spring提供了AbstractFactoryBean作为 实现 FactoryBean的简单模板父类。使用这个基类,我们现在可以更方便地实现一个创建单例或原型对象的工厂bean。
  我们实现一个SingleToolFactory和一个NonSingleToolFactory来显示如何使用AbstractFactoryBean来为单例和原型类型:
public class SingleToolFactory extends AbstractFactoryBean<Tool> {
     
    private int factoryId;
    private int toolId;
 
    @Override
    public Class<?> getObjectType() {
        return Tool.class;
    }
 
    @Override
    protected Tool createInstance() throws Exception {
        return new Tool(toolId);
    }
 
    // standard setters and getters
} 

下面是非单例实现:

public class NonSingleToolFactory extends AbstractFactoryBean<Tool> {
     
    private int factoryId;
    private int toolId;
 
    public NonSingleToolFactory() {
        setSingleton(false);
    }
 
    @Override
    public Class<?> getObjectType() {
        return Tool.class;
    }
 
    @Override
    protected Tool createInstance() throws Exception {
        return new Tool(toolId);
    }
 
    // standard setters and getters
}  

下面是这些工厂bean的XML配置:
    
  1. <beans ...>
  2. <bean id="singleTool" class="com.baeldung.factorybean.SingleToolFactory">
  3. <property name="factoryId" value="3001"/>
  4. <property name="toolId" value="1"/>
  5. </bean>
  6. <bean id="nonSingleTool" class="com.baeldung.factorybean.NonSingleToolFactory">
  7. <property name="factoryId" value="3002"/>
  8. <property name="toolId" value="2"/>
  9. </bean>
  10. </beans>
现在我们可以测试Worker对象的属性是否按照我们预期的方式进行注入:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:factorybean-abstract-spring-ctx.xml" })
public class AbstractFactoryBeanTest {
 
    @Resource(name = "singleTool")
    private Tool tool1;
  
    @Resource(name = "singleTool")
    private Tool tool2;
  
    @Resource(name = "nonSingleTool")
    private Tool tool3;
  
    @Resource(name = "nonSingleTool")
    private Tool tool4;
 
    @Test
    public void testSingleToolFactory() {
        assertThat(tool1.getId(), equalTo(1));
        assertTrue(tool1 == tool2);
    }
 
    @Test
    public void testNonSingleToolFactory() {
        assertThat(tool3.getId(), equalTo(2));
        assertThat(tool4.getId(), equalTo(2));
        assertTrue(tool3 != tool4);
    }
}  
从测试中可以看出,SingleToolFactory生成单例对象,NonSingleToolFactory生成原型对象。
  注意,没有必要在SingleToolFactory中设置singleton属性,因为在AbstractFactory中,singleton属性的默认值为true。

5 结论
 
在Spring中使用FactoryBean可以很好地封装复杂的构造逻辑,或者使 配置 高度可配置的对象变得更加容易。
因此,在这篇文章中,我们介绍了如何实现我们自己的FactoryBean的 基础知识 ,如何基于XML的配置和基于Java的配置使用 FactoryBean ,以及一些其他使用FactoryBean的地方,如初始化的FactoryBean和AbstractFactoryBean。
 
一如以往,该GitHub项目中提供了该示例的完整源代码。







TGRS 2026 即插即用 | 注意力篇 | SCFM:双向交叉显著性引导注意力,高层语义与低层细节的双向互补! 本文介绍了MPCNet中的语义引导交叉注意力融合模块(SCFM),该模块通过双向交叉显著性引导机制实现跨尺度特征融合。SCFM创新性地结合了高层语义和低层细节的互补信息,通过轻量局部空间注意力预增强和坐标注意力全局融合引导,显著提升了红外小目标检测的精度。实验表明,SCFM在多个数据集上达到SOTA性能,同时保持轻量高效的计算特性,支持端侧设备部署。 SCFM的核心贡献包括: 双向交叉显著性引导机制,实现语义与细节的互补融合 轻量局部空间注意力预增强模块,计算量仅为传统方法的1/10 坐标注意力全局融合引导 阅读详情

相关推荐

Crawl4AI实战:5分钟搞定电商价格监控爬虫(附Python代码)

本文详细介绍了如何利用开源AI网络爬虫框架Crawl4AI快速构建电商价格监控系统。通过Python实战代码,展示了从环境配置、智能内容提取到多平台适配、定时任务与数据可视化的完整流程,帮助运营人员和技术开发者高效实现自动化价格追踪与竞品分析。

weixin_29090917的博客 414

Spring之FactoryBean

我们可以将FactoryBean看成Factory + Bean。首先它是一个Bean,和其他Bean一样,归Spring容器管理。同时它也是一个factory可以生产一个定制的Bean。transformedBeanName :将类似"&&&&beanName"的字符串转成"beanName"canonicalName :bean存在别名的说法,比如beanA的别名是beanB,beanB的别名是beanC,如果调用getBean("beanC")最终会获得beanA。

好记性不如烂笔头 2350

CANoe/CANalyzer新手必看:从零配置到报文分析的完整流程(附B站官方教程实操)

本文为CANoe/CANalyzer新手提供从零配置到报文分析的完整流程指南,涵盖硬件连接、工程配置、报文捕获及信号级分析等关键步骤。通过详细的实操案例和B站官方教程,帮助工程师快速掌握汽车电子总线分析工具的核心应用,提升诊断效率与通信系统理解。

y7z8a的博客 772

spring-FactoryBean的作用和使用场景,以及和BeanFactory的区别

BeanFactory和FactoryBean的区别、FactoryBean的作用

weixin_37862824的博客 9463

从零搭建Arduino仿真开发环境:SimulIDE与IDE配置全攻略

本文详细介绍了如何从零搭建Arduino仿真开发环境,涵盖SimulIDE与Arduino IDE的配置全流程。通过仿真模拟环境,开发者可以零成本试错,快速验证电路设计和程序逻辑,特别适合初学者和便携开发需求。文章提供了软件安装、环境配置、项目实战及问题排查的完整指南,帮助读者高效掌握Arduino仿真开发技巧。

weixin_29284657的博客 519

黑群晖断电后存储池‘已损毁’?别慌,SSH里这几条命令能救急

本文详细解析黑群晖断电后存储池显示‘已损毁’的紧急修复方法。通过SSH命令行工具,提供从诊断到修复的完整流程,包括RAID阵列重新组装、设备重建等关键步骤,帮助用户恢复数据访问。适用于因意外断电导致的存储池异常情况。

weixin_42651748的博客 375

Spring的FactoryBean

spring的FactoryBean分析

景川的博客 2097

前端开发 - 完美解决video.js和flv.js视频同时播放数量限制的问题,即浏览器针对同一域名的请求限制问题(解决flv.js/video.js在页面播放最多不超过6个问题、浏览器并发请求限制数

flv.js,video.js,vue,reactive,uniapp,前端开发,flv视频同时播放有限制怎么办,浏览器限制多个视频同时播放怎么办,使用flv.js在前端播放,最多只能播放6个视频,突破浏览器域名并发限制,如何解决flvjs与videojs视频播放同时播放数量限制,video.js 一个页面同时播放多个视频的实例代码,解决网页视频最大只能播放6路的问题,浏览器只能播放6路http-flv流的解决方法,一个浏览器播放5个或者6个flv的视频就不能播放了,video.js 无法在页面同时播放多个

✅ 精选推荐文章 4995

【Spring学习】FactoryBean的使用

FactoryBean 接口对于 Spring 框架来说占有重要的地位,Spring 自身就提供了 70 多个FactoryBean 的实现。它们隐藏了实例化一些复杂 bean 的细节,给上层应用带来了便利。一般情况下,Spring 通过反射机制利用 bean 的 class 属性指定实现类来实例化 bean。在某些情况下,实例化 bean 过程比较复杂,如果按照传统的方式,则需要在中提供大量的配置信息,配置方式的灵活性是受限的,这时采用编码的方式可能会得到一个简单的方案。

qq_43783527的博客 3159

60、磁悬浮主动隔振系统的LQR控制研究

本研究针对磁悬浮主动隔振系统,提出了一种结合ANN建模、LQR控制与MPGA优化的综合控制方案。通过建立系统的动力学与状态空间模型,利用混合训练算法的ANN精确描述MSVI的非线性和滞后特性,并设计基于最小力传递率的LQR控制器。为优化LQR的Q和R矩阵,引入多群体遗传算法(MPGA),有效克服传统GA的早熟收敛问题,提升搜索效率与控制性能。仿真结果表明,在单频、扫频、随机及冲击激励下,该方法显著降低传递力幅值,隔振效果远优于被动系统。研究验证了所提方法的有效性,为磁悬浮隔振技术的实际应用奠定了基础,并展望

linux6sysadmin的博客 127

【部署】Kimi 接入OpenClaw完整步骤及关键注意事项

本文详细介绍了如何将Kimi AI接入OpenClaw系统的完整步骤。首先需确保环境满足OpenClaw版本要求和系统支持,然后通过配置向导完成本地网关设置和Kimi模型接入,包括API密钥配置。文章提供了详细的命令操作和界面截图指导,并重点说明了安全警告处理、服务状态检查、API密钥有效性验证等关键注意事项。最后还展示了Kimi流量消耗明细和问题排查方法,帮助用户顺利完成接入并解决常见问题。整个流程清晰明了,涵盖了从环境准备到最终验证的全部环节。

海兰 7181

Spring之FactoryBean详解

前言 Spring中有BeanFactory接口,也有FactoryBean接口。注意不要混淆两者。有关BeanFactory的内容,请查看博主的另一篇文章:《Spring之BeanFactory详解》 FactoryBean源码解析 首先,先看其类的结构图: 该接口定义的方法不算多,可以看到定义了一个getObject方法,获取对象。getObjectType方法,获取对象类型,还有一个判断是否单利的方法。那么是获取什么对象,判断什么对象是单利呢?我们看其详细注解。 1.如果一个bean实现了这个接口,

敲代码的小小酥的博客 4909

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

spring中FactoryBean的使用

spring中FactoryBean的使用 一 源码中的说明 If a bean implements this interface, it is used as a factory for an object to expose, not directly as a bean instance that will be exposed itself. 翻译:如果一个bean实...

shining的专栏 608

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

如何使用 Spring FactoryBean?

Spring bean容器中有两种类型的bean:普通bean和工厂bean。前者Spring直接使用,后者可以自己生产对象,并由框架进行管理。并且,简单地说,我们可以通过实现org.springframework.beans.factory.FactoryBean接口来构建一个工厂 Bean。

在技术的广袤天地里,本博客如精准罗盘。剖析前沿科技,深掘代码奥秘,以精炼笔触,带您穿越复杂技术迷宫,速达知识彼岸。 1573

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

【Spring】IOC&DI:FactoryBean 使用场景及源码分析

在Spring中,有两个很容易混淆的类:BeanFactory 和 FactoryBean。 BeanFactory:Bean 工厂,是一个工厂(Factory),我们 Spring IOC 容器的最顶层接口就是这个BeanFactory,它的作用是管理 Bean,即实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。 FactoryBean:工厂Bean,是一个 Bean,作用是产生其他 bean实例。通常情况下,这种Bean没有什么特别的要求,仅需要提供一个工厂方法,该方法用来返回其他 Bean

A minor 3918

Spring框架中FactoryBean的使用

本文全面介绍了Spring框架中的FactoryBean接口及其应用。FactoryBean是一种特殊的Bean,用于创建和管理其他Bean实例,通过实现getObject()、getObjectType()和isSingleton()方法封装复杂对象的创建逻辑。文章详细对比了FactoryBean与BeanFactory的区别,分析了FactoryBean在Hibernate集成、AOP代理等场景中的优势,并提供了XML和Java两种配置方式的实现示例。

持续输出Java相关知识 1334

Spring - FactoryBean 的使用场景和源码

FactoryBean 就是 生产 Bean 的 Bean 它的目的就是创建一个对象 示例1一个简单的例子 创建FactoryBean获取创建的对象 FactoryBean 就是 让我们自己 来创建一个对象 但是就像上面的例子中那样, 如果你那样使用,FactoryBean是没有多大的好处 什么时候使用? 问题就在这里, 如果这里的创建步骤特别复杂,或需要计算后 才能得到一个对象。就可以使用 示例2 根据指定数据创建对象 当创建对象的过...

深度 9640

Spring的FactoryBean的使用

FactoryBean package com.wjz.spring; import org.springframework.beans.factory.FactoryBean; import com.wjz.demo.Foo; @SuppressWarnings("rawtypes") public class FooFactoryBean impleme...

134

【Spring】基于XML的Spring容器配置——FactoryBean的使用

是Spring框架中的一个接口,允许开发者定义一个工厂类,以便创建和配置Bean。实现接口的类可以提供自定义的Bean实例,而不是简单地返回类的实例。首先,我们创建一个简单的对象类,它将由创建。@Override通过上述示例,我们深入理解了Spring中的使用及其重要性。不仅提供了灵活的对象创建机制,还可以帮助我们管理复杂对象的生命周期和配置。在实际开发中,的应用可以极大地提高代码的可维护性和可重用性。

thinking_chou的专栏 1017

Spring FactoryBean接口使用

简介 Spring中有两种类型的Bean,一种是普通Bean,另一种是工厂Bean,即FactoryBean。工厂Bean跟普通Bean不同,其返回的对象不是指定类的一个实例,其返回的是该工厂Bean的getObject方法所返回的对象。 一般情况下,Spring 通过反射机制利用 Bean 的 class 属性指定实现类实例化 Bean ,在某些情况下,实例化 Bean 过程比较复杂,如果按照...

极客on之路 288

【转】Spring中FactoryBean的使用

本篇文章转载自Spring源码深度解析第二版 作者:郝佳,侵删 FactorvBean 的使用 一般情况下, Spring 通过反射机制利用 bean 的 class 属性指定实现类来实例化 bean 。 在某些情况下,实例化 bean 过程比较复杂,如果按照传统的方式, 则需要在<bean>中提供大量的配置信息,配置方式的灵活性是受限的,这时采用编码的方式可能会得到一个简单的方...

qq_38762479的博客 359

Spring中FactoryBean的使用方法

可以理解为工厂非静态方法的特例: import org.joda.time.DateTime; import org.springframework.beans.factory.FactoryBean; public class NextDayDateFactoryBean implements FactoryBean { @Override p...

dengyiyu5280的博客 186

Spring的FactoryBean使用

Spring中有两种类型的Bean,一种是普通Bean,另一种是工厂Bean,即FactoryBean。工厂Bean跟普通Bean不同,其返回的对象不是指定类的一个实例,其返回的是该工厂Bean的getObject方法所返回的对象。 如果大家有看过Mybatis的SessionFactoryBean和Activiti初始化引擎的ProcessEngineFactoryBean两个类就应该

QuantSeven 1047

Spring 中 FactoryBean 的使用

许久没记录笔记了,这回来重新熟悉一下 Spring 中 FactoryBean 的使用,顾名思义,它是用来获得相应 Bean 的工厂的。它与另一个 Spring 中的接口 BeanFactory 的作用不一样的,不能多说了。FactoryBean 和 BeanFactory 都是在org.springframework.beans.factory包中,谁能一看类名搞清楚它们的差别? Fact...

一叶不知秋 427

Spring 中接口 FactoryBean 的使用

概述 Spring 中有两类bean:普通bean(ordinary bean)和工厂bean(factory bean)。要实现一个工厂bean,只要类实现接口 org.springframework.beans.factory.FactoryBean 即可1 2。 FactoryBean 接口的定义如下: public interface FactoryBean&amp;amp;amp;amp;lt;T&amp;amp;amp;amp;gt; { ...

江湖中人的专栏 981

Spring中FactoryBean的使用

本文主要介绍什么是FactoryBean技术?为什么使用FactoryBean?使用FactoryBean的好处?目前优秀的框架有哪些用到了FactoryBean? 1. FactoryBean的介绍: FactoryBean从字面意思上理解是工厂bean,他可以生成某一个类型Bean实例,它最大的一个作用是:可以让我们自定义Bean的创建过程。 一...

qq_35634181的博客 3284
上一篇: FactoryBean 是什么
下一篇: 【单例深思】Java 单例模式全解
TaiSung
博客等级 码龄15年 49粉丝 132原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值