当前位置: 首页 > 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.dtcms.com/a/288278.html

相关文章:

  • 架构探索笔记【1】
  • 如何快速学习一门新技术
  • 实用的文件和文件夹批量重命名工具
  • 手撕Spring底层系列之:注解驱动的魔力与实现内幕
  • 【Linux】重生之从零开始学习运维之Nginx
  • 【服务器与部署 14】消息队列部署:RabbitMQ、Kafka生产环境搭建指南
  • Linux中添加重定向(Redirection)功能到minishell
  • 中小机构如何低成本搭建教育培训平台?源码开发+私有化部署攻略
  • 什么是帕累托最优,帕累托最优如何运用在组相联映像中
  • AspectJ 表达式中常见符号说明
  • GoogleBenchmark用法
  • 环形区域拉普拉斯方程傅里叶级数解
  • 电阻耐压参数学习总结
  • 再谈进程-控制
  • 敏感词 v0.27.0 新特性之词库独立拆分
  • 5-大语言模型—理论基础:注意力机制优化
  • 关于个人博客系统的测试报告
  • Typecho评论系统集成Markdown编辑器完整教程
  • Windows事件查看器完整指南
  • 最少标记点问题:贪心算法解析
  • 深入了解 find_element 方法:Web 自动化定位元素的核心​
  • Linux某个进程CPU占用率高原因定位手段
  • Vue基础(前端教程①-路由)
  • 从 C# 转 Python 第三天:文件操作、异常处理与错误日志实践
  • 量子计算与AI融合的技术突破与实践路径
  • 物联网系统中-告警配置功能的定义
  • #Datawhale组队学习#7月-强化学习Task2
  • Java行为型模式---状态模式
  • python类Keys
  • kombu 运行超长时间任务导致RabbitMQ消费者断开