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

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.xdnf.cn/news/15807.html

相关文章:

  • Java行为型模式---访问者模式
  • 用Dynamic chunk去干掉tokenizer?
  • 从零入门:云迁移原理详解与华为Rainbow实战指南
  • 数据结构 队列
  • 信息系统风险的安全技术防范思路
  • 教育科技内容平台的破局之路:从组织困境到 UGC 生态的构建
  • CCF编程能力等级认证GESP—C++7级—20250628
  • [FFmpeg] AVFormatContext、AVInputFormat、AVOutputFormat | libavformat
  • 为任意Java程序配置Socks5与HTTP代理的方法
  • 2025年水安备考:水利水电安全员C类考试题
  • 基于Scrapy-Redis的分布式爬虫系统:工业级实现与深度优化
  • nodejs值process.kill
  • CCF编程能力等级认证GESP—C++8级—20250628
  • 信息学奥赛一本通 1579:【例 5】皇宫看守 | 洛谷 P2458 [SDOI2006] 保安站岗
  • 教你如何借助AI精读文献
  • MC0463四大名著-水浒签到
  • 在Vscode中使用Kimi K2模型:实践指南,三分钟生成个小游戏
  • 网络大提速,RDMA,IB,iWrap
  • 深度学习中的模型剪枝工具Torch-Pruning的使用
  • 如何解决AttributeError: ‘NoneType‘ object has no attribute问题
  • 使用 PlanetScope 卫星图像绘制水质参数:以莫干湖为例
  • 记录我coding印象比较深刻的BUG
  • 【Docker项目实战】使用Docker部署Homeland社区系统
  • 以太坊的心脏与大脑:详解执行客户端(EL)与共识客户端(CL)
  • 网络原理——TCP
  • node.js学习笔记1
  • 云边端协同架构下的智能计算革命
  • 解惑LINQ中的SelectMany用法
  • 一站式PDF转Markdown解决方案PDF3MD
  • 数据库第四次作业