FactoryBean 接口

 Spring 框架中 FactoryBean 接口的特性,这是 Spring 提供的一种特殊机制,用于创建和管理复杂 Bean。让我通过示例和解释帮您理解这个概念。

一、FactoryBean 是什么?

FactoryBean 是 Spring 框架提供的一个工厂接口,用于创建复杂或需要特殊处理的 Bean。当一个类实现了 FactoryBean<T> 接口,Spring 会将其视为工厂 Bean,并通过它来获取真正的 Bean 实例。

核心方法

  • getObject():返回实际的 Bean 实例。
  • getObjectType():返回 Bean 的类型。
  • isSingleton():是否为单例(默认 true)。

二、为什么需要 FactoryBean?

当 Bean 的创建过程复杂(如需要参数校验、依赖注入、动态代理等),直接在 XML 或注解中配置会很繁琐。FactoryBean 允许您将复杂的创建逻辑封装在工厂类中,让 Spring 容器更简洁。

三、示例解析

提供的代码展示了 FactoryBean 的基本用法:

1.普通 Bean(Person)

public class Person {public Person() {System.out.println("Person的无参数构造方法执行。");}
}

2.工厂 Bean(PersonFactoryBean)

public class PersonFactoryBean implements FactoryBean<Person> {@Overridepublic Person getObject() throws Exception {return new Person(); // 自定义创建逻辑}@Overridepublic Class<?> getObjectType() {return Person.class; // 返回实际类型(您的代码中返回 null,应修正为 Person.class)}@Overridepublic boolean isSingleton() {return true; // 是否单例}
}

3.Spring 配置文件

<bean id="person" class="org.example1.bean.PersonFactoryBean"/>

四、关键特性:自动调用机制

当您在 Spring 中配置一个实现了 FactoryBean 的类时:

  1. factory-bean 自动指向:Spring 会自动将 id="person" 的 Bean 指向 PersonFactoryBean 实例。
  2. factory-method 自动调用:Spring 会自动调用 getObject() 方法来获取实际的 Person 实例。

等效于以下传统配置

<!-- 手动配置工厂 Bean -->
<bean id="personFactory" class="org.example1.bean.PersonFactoryBean"/><!-- 通过 factory-bean 和 factory-method 调用 -->
<bean id="person" factory-bean="personFactory" factory-method="getObject"/>

但使用 FactoryBean 接口后,您只需配置一行

<bean id="person" class="org.example1.bean.PersonFactoryBean"/>

五、验证示例

假设您有以下测试代码:

ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
Person person = context.getBean("person", Person.class);
System.out.println(person.getClass()); // 输出:class org.example1.bean.Person

执行流程

  1. Spring 加载 PersonFactoryBean 作为工厂 Bean。
  2. 当您请求 id="person" 的 Bean 时,Spring 自动调用 PersonFactoryBean.getObject()
  3. 返回的 Person 实例被注入到 person 变量中。

六、常见应用场景

  1. 复杂初始化:如创建数据库连接池、配置第三方 API 客户端。
  2. 代理对象创建:如 Spring AOP 中的代理对象生成。
  3. 动态 Bean 生成:根据运行时条件创建不同类型的 Bean。

七、注意事项

  1. 类型问题getObjectType() 必须返回正确的类型(您的代码中返回 null 会导致问题,应改为 Person.class)。
  2. 单例控制:通过 isSingleton() 方法控制 Bean 是否为单例。
  3. Bean 命名
  • id="person" 返回的是 Person 实例(通过 getObject())。
  • 若需要获取 PersonFactoryBean 本身,使用 &person(例如:context.getBean("&person"))。

总结

FactoryBean 是 Spring 提供的一种强大机制,让您可以将复杂的 Bean 创建逻辑封装在工厂类中,同时保持配置的简洁性。通过实现该接口,Spring 会自动处理工厂 Bean 的注册和调用,无需手动指定 factory-bean 和 factory-method

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

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

相关文章

MySQL + CloudCanal + Iceberg + StarRocks 构建全栈数据服务

简述 在业务数据快速膨胀的今天&#xff0c;企业对 低成本存储 与 实时查询分析能力 的需求愈发迫切。 本文将带你实战构建一条 MySQL 到 Iceberg 的数据链路&#xff0c;借助 CloudCanal 快速完成数据迁移与同步&#xff0c;并使用 StarRocks 完成数据查询等操作&#xff0c…

javaEE->多线程:线程池

线程池 线程诞生的意义&#xff1a;因为进程的创建/销毁&#xff0c;太重量了&#xff08;比较慢&#xff09; 但如果近一步提高创建/销毁的频率&#xff0c;线程的开销也不容忽视。 有两种方法可以提高效率&#xff1a; 1.协程&#xff08;轻量级线程&#xff09;&#xff…

【001】利用github搭建静态网站_essay

文章目录 1. 简介2. 先了解网址规则2.1 文件及网址形式2.2 相互访问 3. 搭建网页的过程3.1 网页文件3.2 github搭建仓库及文件上传3.3 搭建网站 1. 简介 相信大家都有过想要自己搭建一个稳定可靠的网站&#xff0c;github是一个不错的选择&#xff0c;本来国内有gitee可以搭建…

搜索引擎2.0(based elasticsearch6.8)设计与实现细节(完整版)

1 简介 1.1 背景 《搜索引擎onesearch 1.0-设计与实现.docx》介绍了1.0特性&#xff0c;搜索schema&#xff0c;agg&#xff0c;表达式搜索映射&#xff0c;本文介绍onesearch 2.0 新特性, 参考第2节 规划特性与发布计划 1.2 关键词 文档 Document elasticsearch 一行数据称为…

【ClickHouse】RollingBitmap

ClickHouse 的 RollingBitmap 是一种基于 Bitmap 的数据结构&#xff0c;用于高效处理数据的动态变化和时间窗口计算。以下是关于 ClickHouse RollingBitmap 的相关信息&#xff1a; RollingBitmap 的应用场景 RollingBitmap 主要用于需要处理动态数据和时间窗口计算的场景&am…

新版智慧社区(小区)智能化弱电系统解决方案

该方案聚焦新版智慧社区智能化弱电系统建设,以物联网、云计算、AI 人脸识别等技术为支撑,构建涵盖智能可视化对讲、智慧门禁、智能梯控、智慧停车、视频监控等核心系统的社区智能化体系,并通过智慧社区集成平台实现设备管理、数据统计、预警联动等功能。方案旨在解决传统社区…

11高可用与容错

一、Broker 高可用架构设计 1.1 RabbitMQ 镜像集群方案 集群搭建步骤 # 节点1初始化 rabbitmq-server -detached rabbitmq-plugins enable rabbitmq_management# 节点2加入集群 rabbitmqctl stop_app rabbitmqctl join_cluster rabbitnode1 rabbitmqctl start_app# 创建镜像…

AsyncIOScheduler与BackgroundScheduler的线程模型对比

1. BackgroundScheduler的线程机制‌ ‌多线程模型‌&#xff1a;BackgroundScheduler基于线程池执行任务&#xff0c;默认通过ThreadPoolExecutor创建独立线程处理任务&#xff0c;每个任务运行在单独的线程中&#xff0c;主线程不会被阻塞。‌适用场景‌&#xff1a;适合同步…

ceph 对象存储用户限额满导致无法上传文件

查看日志 kl logs -f rook-ceph-rgw-my-store-a-5cc4c4d5b5-26n6j|grep -i error|head -1Defaulted container "rgw" out of: rgw, log-collector, chown-container-data-dir (init) debug 2025-05-30T19:44:11.573+0000 7fa7b7a6d700

2025-05-31 Python深度学习9——网络模型的加载与保存

文章目录 1 使用现有网络2 修改网络结构2.1 添加新层2.2 替换现有层 3 保存网络模型3.1 完整保存3.2 参数保存&#xff08;推荐&#xff09; 4 加载网络模型4.1 加载完整模型文件4.2 加载参数文件 5 Checkpoint5.1 保存 Checkpoint5.2 加载 Checkpoint 本文环境&#xff1a; Py…

批量导出CAD属性块信息生成到excel——CAD C#二次开发(插件实现)

本插件可实现批量导出文件夹内大量dwg文件的指定块名的属性信息到excel&#xff0c;效果如下&#xff1a; 插件界面&#xff1a; dll插件如下&#xff1a; 使用方法&#xff1a; 1、获取此dll插件。 2、cad命令行输入netload &#xff0c;加载此dll&#xff08;要求AutoCAD&…

在Linux环境里面,Python调用C#写的动态库,如何实现?

在Linux环境中&#xff0c;Python可以通过pythonnet&#xff08;CLR的Python绑定&#xff09;或subprocess调用C#动态库。以下是两种方法的示例&#xff1a; 方法1&#xff1a;使用pythonnet&#xff08;推荐&#xff09; 前提条件 安装Mono或.NET Core运行时安装pythonnet包…

小程序跳转H5或者其他小程序

1. h5跳转小程序有两种情况 &#xff08;1&#xff09;从普通浏览器打开的h5页面跳转小程序使用wx-open-launch-weapp可以实现h5跳转小程序 <wx-open-launch-weappstyle"display:block;"v-elseid"launch-btn":username"wechatYsAppid":path…

性能优化 - 案例篇:缓冲区

文章目录 Pre1. 引言2. 缓冲概念与类比3. Java I/O 中的缓冲实现3.1 FileReader vs BufferedReader&#xff1a;装饰者模式设计3.2 BufferedInputStream 源码剖析3.2.1 缓冲区大小的权衡与默认值 4. 异步日志中的缓冲&#xff1a;Logback 异步日志原理与配置要点4.1 Logback 异…

文档整合自动化

主要功能是按照JSON文件&#xff08;Sort.json&#xff09;中指定的顺序合并多个Word文档&#xff08;.docx&#xff09;&#xff0c;并清除文档中的所有超链接。最终输出合并后的文档名为"sorted_按章节顺序.docx"。 主要分为几个部分&#xff1a; 初始化配置 定…

嵌入式(C语言篇)Day13

嵌入式Day13 一段话总结 文档主要介绍带有头指针和尾指针的单链表的实现及操作&#xff0c;涵盖创建、销毁、头插、尾插、按索引/数据增删查、遍历等核心操作&#xff0c;强调头插/尾插时间复杂度为O(1)&#xff0c;按索引/数据操作需遍历链表、时间复杂度为O(n)&#xff0c;并…

【ASR】基于分块非自回归模型的流式端到端语音识别

论文地址:https://arxiv.org/abs/2107.09428 摘要 非自回归 (NAR) 模型在语音处理中越来越受到关注。 凭借最新的基于注意力的自动语音识别 (ASR) 结构,与自回归 (AR) 模型相比,NAR 可以在仅精度略有下降的情况下实现有前景的实时因子 (RTF) 提升。 然而,识别推理需要等待…

RNN循环网络:给AI装上“记忆“(superior哥AI系列第5期)

&#x1f504; RNN循环网络&#xff1a;给AI装上"记忆"&#xff08;superior哥AI系列第5期&#xff09; 嘿&#xff01;小伙伴们&#xff0c;又见面啦&#xff01;&#x1f44b; 上期我们学会了让AI"看懂"图片&#xff0c;今天要给AI装上一个更酷的技能——…

DAY41 CNN

可以看到即使在深度神经网络情况下&#xff0c;准确率仍旧较差&#xff0c;这是因为特征没有被有效提取----真正重要的是特征的提取和加工过程。MLP把所有的像素全部展平了&#xff08;这是全局的信息&#xff09;&#xff0c;无法布置到局部的信息&#xff0c;所以引入了卷积神…

【仿生系统】爱丽丝机器人的设想(可行性优先级较高)

非程序化、能够根据环境和交互动态产生情感和思想&#xff0c;并以微妙、高级的方式表达出来的能力 我们不想要一个“假”的智能&#xff0c;一个仅仅通过if-else逻辑或者简单prompt来模拟情感的机器人。您追求的是一种更深层次的、能够学习、成长&#xff0c;并形成独特“个性…