如何使用Spring FactoryBean?

【SABRE 3D, SABRE 3DxT,LAM设备】2025年9月10日 前文:SABRE 3D系列机台简介本章节详细阐述了在维护期间锁定电气、机械、热力学及重力组件以及化学管线输入的锁定操作流程,旨在降低人员受伤风险。p42~p55。 阅读详情
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项目中提供了该示例的完整源代码。







Windows 10下用VS2022编译AFSIM 2.9.0的完整避坑指南 本文提供了在Windows 10系统下,使用Visual Studio 2022编译AFSIM 2.9.0仿真框架的详细指南。文章系统梳理了从环境准备、CMake配置、编译链接到安装打包的全流程,并重点针对编译过程中常见的文件编码、命名空间冲突等高频错误提供了具体解决方案,旨在帮助开发者高效避坑,顺利完成AFSIM在Windows平台上的构建。 阅读详情

相关推荐

STM32 SAES硬件加密协处理器全模式工程实践指南

AES(高级加密标准)是嵌入式系统中最基础且关键的对称密码算法,其硬件加速实现直接影响安全、性能与功耗平衡。Secure AES Coprocessor(SAES)作为STMicroelectronics在STM32U5等高安全MCU中集成的专用密码协处理器,不仅支持标准ECB/CBC/CTR模式,更原生兼容GCM和CCM等认证加密模式,具备抗侧信道、密钥保护与DMA卸载能力。理解其寄存器状态机(CHMOD/MODE/CPHASE)、NPBLB数据对齐机制及GCM四阶段编程范式,是规避Tag校验失败、IV错

weixin_42311427的博客 76

Spring之FactoryBean

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

好记性不如烂笔头 2350

Apollo和autoware规划算法代码ros移植-路径规划可跑工程分享

Apollo6.0规划核心代码移植到Ros工程,可编译移植分享

weixin_39735688的博客 8508

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

BeanFactory和FactoryBean的区别、FactoryBean的作用

weixin_37862824的博客 9463

驱动兼容_FANUC 驱动器兼容问题探讨

近10年来,FANUC伺服驱动器随着系统的升级而升级,不同的系统,可以兼容很多种类的驱动器,作者做了一些常见经验总结如下表:电源模块伺服放大器主轴放大器bi一体18i/OIB/OIC6110-Hxxx6114-Hxxx6111-Hxxx6134-Hxxx31iA/OID6140-Hxxx6117-Hxxx6141-Hxxx6164-Hxxx31IB/35IB/OIF/OI MATE D(5包)62...

weixin_34420941的博客 1751

交换机救命命令手册:华为 & 思科平台最全运维指令速查表

很多时候,真正拉你一把的不是“高深理论”,而是你手里有没有一份靠得住的命令速查表。这篇文章,希望能成为你“进可调试,退可排障”的一份救命卡片。

HuaweiLab_Peach的博客 1515

Spring的FactoryBean

spring的FactoryBean分析

景川的博客 2096

Visual Studio报错TRK0005找不到CL.exe?三步彻底解决环境变量问题

本文详细解析了Visual Studio报错TRK0005找不到CL.exe的根本原因,并提供了三步彻底解决环境变量问题的方案。从验证安装完整性到配置永久环境变量,再到注册表级修复,帮助开发者建立健壮的开发环境配置体系,确保编译链稳定运行。

weixin_30839881的博客 459

【Spring学习】FactoryBean的使用

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

qq_43783527的博客 3159

【深度学习新浪潮】2025年末AI产业动态:泡沫争议、技术突破与2026投资机会解析

2025年末的AI产业在波动中完成了阶段性调整,技术突破与政策支持构筑了长期成长基石,而结构性分化与风险隐患则要求投资者更加精准地把握机会。2026年作为“风险资产的黄金年”,AI全产业链将持续成为资本聚焦的核心,无论是算力国产化的技术突破,还是应用场景的规模化落地,都有望催生一批优质企业。投资者需立足产业阶段特征,理性看待短期波动,聚焦核心技术与政策红利,方能在AI产业的成长浪潮中把握确定性机会。

专注:太空算力、AI infra、异构调度、大模型成本工程 1809

季节性注意力的时间序列预测模型 SAITS 进行数据补齐 完整代码数据

季节性注意力的时间序列预测模型 SAITS 进行数据补齐 完整代码数据

1071

Spring之FactoryBean详解

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

敲代码的小小酥的博客 4909

手把手教你安装 OpenClaw 小龙虾(MAC安装教程),一次成功不踩坑

本文详细介绍了在Mac上安装OpenClaw的完整流程。主要内容包括:1)准备工作(磁盘空间、网络环境、终端工具);2)安装Homebrew包管理器及常见问题解决;3)安装Node.js 22+版本(环境核心);4)Git安装与验证;5)OpenClaw项目克隆、依赖安装及运行配置;6)大模型配置方法(以MiniMax为例)。文章提供了详细的命令行操作步骤和常见错误解决方案,特别强调了网络环境要求和Apple Silicon芯片的原生支持注意事项。最后展示了验证配置成功的方法和资源获取渠道。

Chengbei11的博客 6337

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

计算机控制技术及应用

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

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

如何使用 Spring FactoryBean?

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

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

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

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

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

A minor 3918

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

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

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值