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

BeanFactory 和FactoryBean的区别

BeanFactory 和 FactoryBean 是 Spring 框架中的两个核心接口,它们虽然名称相似,但作用和使用场景不同。

1. BeanFactory

BeanFactory 是 Spring 容器的顶级接口,负责管理和提供 Bean 实例。它是 Spring 容器的核心部分,定义了如何获取 Bean 的基本操作。

主要职责:
提供对单个 Bean 的访问。
延迟加载(Lazy Initialization):只有在第一次请求时才会实例化 Bean。
管理 Bean 的生命周期,包括创建、配置、初始化、销毁等。

常见实现:
XmlBeanFactory:通过解析 XML 配置文件来生成和管理 Bean 实例。
DefaultListableBeanFactory:可以注册和管理 Bean 的最常用实现类。

使用场景:
通常用于开发时直接使用 Spring 容器,如 ApplicationContext,而不是直接使用 BeanFactory。ApplicationContext 是 BeanFactory 的子接口,提供了更多高级功能。

2. FactoryBean

FactoryBean 是一个用于创建复杂 Bean 的接口。与普通 Bean 不同,它本身是一个 Bean,可以通过 getObject() 方法返回一个由它生成的其他 Bean 实例。

主要职责:
用于创建复杂对象,或者在生成 Bean 时需要一些额外的逻辑时使用。
可以提供 Bean 的代理对象,例如,ProxyFactoryBean 用于创建代理对象。
可以控制 Bean 的创建逻辑,例如懒加载、创建单例或原型实例等。

典型实现:
ProxyFactoryBean:用于创建 AOP 代理。
HibernateSessionFactoryBean:用于创建 Hibernate 的 SessionFactory。
JndiObjectFactoryBean:用于从 JNDI 中查找对象。

使用场景:
当需要动态创建 Bean 或者 Bean 的创建需要复杂的逻辑时使用 FactoryBean。
FactoryBean 的特殊之处在于,通过 getObject() 方法返回的 Bean 其实是一个代理,而不是 FactoryBean 本身。如果想获取 FactoryBean 本身,可以在 Bean 名称前加上 & 前缀。

总结:

BeanFactory 是一个核心接口,负责管理 Bean 的生命周期和提供 Bean 实例,是 Spring 容器的基础。
FactoryBean 是用于创建复杂 Bean 的工厂类接口,通过它可以自定义 Bean 的实例化逻辑。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • linux常用网络工具汇总二
  • Duilib 二
  • openfeign本地试用
  • 工厂模式 vs 策略模式:Java设计模式详细对比
  • 科学碳目标|科学碳倡议|SBTI认证|科学基础目标倡议
  • JSONB字段搜索走索引
  • 【人工智能】常用的人工智能框架、模型、使用方法、应用场景以及代码实例的概述
  • 嵌入式实时操作系统VxWorks面试题及参考答案(4万字长文)
  • 学习笔记第十九天
  • 网络编程先验知识1
  • Flake8 和 Autopep8 使用指南
  • 用AI生成海报设计!AI绘画大模型Flux的在线使用!
  • 【NLP】文本预处理的概念、处理方法、数学公式
  • K8s集群里 中Flannel的状态显示为CrashLoopBackOff 时
  • Stable Diffusion绘画 | 提示词基础原理
  • 实现windows 窗体的自己画,网上摘抄的,学习了
  • [nginx文档翻译系列] 控制nginx
  • 08.Android之View事件问题
  • extjs4学习之配置
  • gcc介绍及安装
  • JavaScript-Array类型
  • LeetCode18.四数之和 JavaScript
  • Python十分钟制作属于你自己的个性logo
  • React+TypeScript入门
  • Redis中的lru算法实现
  • vue-router 实现分析
  • 警报:线上事故之CountDownLatch的威力
  • 面试题:给你个id,去拿到name,多叉树遍历
  • 漂亮刷新控件-iOS
  • 如何学习JavaEE,项目又该如何做?
  • -- 数据结构 顺序表 --Java
  • 数据科学 第 3 章 11 字符串处理
  • 腾讯优测优分享 | 你是否体验过Android手机插入耳机后仍外放的尴尬?
  • 推荐一款sublime text 3 支持JSX和es201x 代码格式化的插件
  • 一个完整Java Web项目背后的密码
  • 在Unity中实现一个简单的消息管理器
  • 《码出高效》学习笔记与书中错误记录
  • ionic入门之数据绑定显示-1
  • Linux权限管理(week1_day5)--技术流ken
  • 好程序员web前端教程分享CSS不同元素margin的计算 ...
  • ​​​​​​​STM32通过SPI硬件读写W25Q64
  • !!【OpenCV学习】计算两幅图像的重叠区域
  • #、%和$符号在OGNL表达式中经常出现
  • #{}和${}的区别?
  • #php的pecl工具#
  • #我与Java虚拟机的故事#连载02:“小蓝”陪伴的日日夜夜
  • $.each()与$(selector).each()
  • ()、[]、{}、(())、[[]]等各种括号的使用
  • (C++17) optional的使用
  • (Oracle)SQL优化技巧(一):分页查询
  • (附源码)ssm本科教学合格评估管理系统 毕业设计 180916
  • (经验分享)作为一名普通本科计算机专业学生,我大学四年到底走了多少弯路
  • (求助)用傲游上csdn博客时标签栏和网址栏一直显示袁萌 的头像
  • (四)docker:为mysql和java jar运行环境创建同一网络,容器互联
  • (四)图像的%2线性拉伸