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

BeanFactory 和 FactoryBean 的区别

BeanFactory和FactoryBean的区别
7.5.1 BeanFactory
Spring IoC容器的顶级对象,BeanFactory被翻译为“Bean工厂”,在Spring的IoC容器中,“Bean工厂”负责创建Bean对象。
BeanFactory是工厂。
7.5.2 FactoryBean
FactoryBean:它是一个Bean,是一个能够辅助Spring实例化其它Bean对象的一个Bean。
在Spring中,Bean可以分为两类:
第一类:普通Bean
第二类:工厂Bean(记住:工厂Bean也是一种Bean,只不过这种Bean比较特殊,它可以辅助Spring实例化其它Bean对象。)

BeanFactory 和 FactoryBean 的区别

BeanFactoryFactoryBean 是 Spring 框架中两个重要但完全不同的接口,它们的名称相似但功能完全不同。

1. BeanFactory (Bean 工厂)

角色:Spring 容器的根接口,是 IoC 容器的基础实现

功能

  • 负责管理 Bean 的创建、配置和生命周期
  • 是 Spring 的核心容器接口
  • 提供基本的依赖注入功能
  • 默认实现是 DefaultListableBeanFactory

特点

  • 是 Spring 容器本身
  • 延迟加载 Bean(默认情况下)
  • 提供基本的容器功能

使用示例

BeanFactory factory = new XmlBeanFactory(new ClassPathResource("beans.xml"));
MyBean bean = factory.getBean(MyBean.class);

2. FactoryBean (工厂 Bean)

角色:特殊的 Bean,用于创建其他 Bean 的工厂

功能

  • 是一个能生产或修饰对象生成的工厂 Bean
  • 实现该接口的类可以自定义 Bean 的创建逻辑
  • 常用于集成第三方框架或复杂对象的创建

特点

  • 是一个被 Spring 管理的 Bean
  • 本身也是一个工厂
  • 通常用于创建复杂的、需要特殊初始化的对象

使用示例

public class MyFactoryBean implements FactoryBean<MyComplexObject> {@Overridepublic MyComplexObject getObject() throws Exception {// 复杂的创建逻辑return new MyComplexObject();}@Overridepublic Class<?> getObjectType() {return MyComplexObject.class;}@Overridepublic boolean isSingleton() {return true;}
}

主要区别

特性BeanFactoryFactoryBean
角色Spring 容器本身一个特殊的 Bean
功能管理所有 Bean 的生命周期负责创建特定的 Bean
使用场景整个 Spring 应用的基础容器需要自定义复杂对象的创建逻辑时使用
实现方式Spring 框架提供的核心接口开发者可以实现的接口
获取方式应用的基础容器通过容器获取其生产的对象

关键记忆点

  • BeanFactory 是"工厂的工厂",是整个 Spring 容器
  • FactoryBean 是"工厂的 Bean",是能够生产其他 Bean 的特殊 Bean
  • 当你想获取 FactoryBean 本身而非它生产的对象时,需要在 bean name 前加 & 符号
// 获取 FactoryBean 生产的对象
MyComplexObject obj = context.getBean("myFactoryBean");// 获取 FactoryBean 本身
FactoryBean<?> factory = context.getBean("&myFactoryBean");
http://www.lryc.cn/news/593304.html

相关文章:

  • Netty网络聊天室及扩展序列化算法
  • (后者可以节约内存/GPU显存)Pytorch中求逆torch.inverse和解线性方程组torch.linalg.solve有什么关系
  • 单调队列深度解析(下)
  • 7.19 换根dp | vpp |滑窗
  • 物联网-规则引擎的定义
  • LeetCode中等题--167.两数之和II-输入有序数组
  • RT-Thread的概念和移植
  • Spring AI 项目实战(十八):Spring Boot + AI + Vue3 + OSS + DashScope 实现高效语音识别系统(附完整源码)
  • OpenCV 官翻7 - 对象检测
  • Edge浏览器设置网页自动翻译
  • #Datawhale组队学习#7月-强化学习Task2
  • 医疗AI与融合数据库的整合:挑战、架构与未来展望(上)
  • 高压电工作业证考试核心考点:电气安全基础篇
  • MCP 协议详细分析一 initialize ping tools/list tools/call
  • 初识C++——开启新旅途
  • 简单易懂,两级页表(多级页表)
  • 文生图-StoryGAN:用于故事可视化的顺序条件GAN
  • Python观察者模式详解:从理论到实战
  • kombu 运行超长时间任务导致RabbitMQ消费者断开
  • Linux 内存管理(2):了解内存回收机制
  • Java程序猿搬砖笔记(十九)
  • curl 命令详解
  • 自动驾驶仿真领域常见开源工具
  • Unity 3D碰撞器
  • 剧本杀小程序开发:科技赋能,重塑推理娱乐新形态
  • Rust+ChatBoxAI:实战
  • Rust Web 全栈开发(九):增加教师管理功能
  • 加法速算之尾数法
  • 企业运维实战:Jenkins 依赖 JDK21 与应用需 JDK1.8 共存方案(含流水线配置)
  • Jenkins 实现项目的构建和发布