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

FactoryBean和BeanFactory:Spring IOC容器的两个重要角色简介

目录

一、简介

二、BeanFactory

三、FactoryBean

四、区别

五、使用场景

总结


一、简介

在Spring框架中,IOC(Inversion of Control)容器是一个核心组件,它负责管理和配置Java对象及其依赖关系,实现了控制反转(Inversion of Control)和依赖注入(Dependency Injection)两个核心概念。

控制反转是一种设计原则,它表示将对象的创建和配置从代码中转移到外部容器中,由容器来负责管理对象的生命周期和依赖关系。这样可以使得代码更加松耦合,更加易于阅读和维护。

依赖注入是一种实现控制反转的技术,它表示由容器根据配置文件或注解来自动地将对象所需的依赖对象注入到其属性或构造方法中。这样可以使得代码更加灵活,更加易于扩展和测试。

在Spring框架中,有两个与IOC容器相关的重要接口,分别是BeanFactory和FactoryBean。它们的名字看起来很相似,但是它们的功能和用法却有很大的区别。本文将介绍这两个接口的定义,特点,区别和使用场景。

二、BeanFactory

FactoryBean也是一个接口,但它不是IOC容器的接口,而是一个特殊的Bean。它具有工厂方法(Factory Method)的功能,在程序运行中产生指定类型的对象,并添加到IOC容器中。它的职责包括:

  • 实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。
  • 提供对Bean的检索、判断、类型匹配、别名等功能。
  • 管理Bean的作用域(Scope)和生命周期(Lifecycle)。

BeanFactory只是个接口,并不是IOC容器的具体实现,所以Spring容器给出了很多种实现,如DefaultListableBeanFactory, XmlBeanFactory, ApplicationContext等,其中XmlBeanFactory就是常用的一个,该实现将以XML方式描述组成应用的对象及对象间的依赖关系。

三、FactoryBean

FactoryBean也是一个接口,但它不是IOC容器的接口,而是一个特殊的Bean。它具有工厂方法(Factory Method)的功能,在程序运行中产生指定类型的对象,并添加到IOC容器中。它的职责包括:

  • 创建复杂或特殊类型的对象,并封装对象的创建细节。
  • 修饰或增强已有类型的对象,并提供额外的功能。
  • 返回与普通Bean不同类型或不同实例的对象,并支持单例或多例模式。

FactoryBean也只是个接口,并不是工厂方法模式(Factory Method Pattern)或抽象工厂模式(Abstract Factory Pattern)的具体实现,所以Spring框架提供了很多种实现,如ProxyFactoryBean, GsonFactoryBean, JndiObjectFactoryBean等,其中ProxyFactoryBean就是常用的一个,该实现可以创建AOP代理对象,并为目标对象添加切面逻辑。

四、BeanFactory和FactoryBean的区别

从上面的介绍可以看出,BeanFactory和FactoryBean有以下几个主要区别:

  • BeanFactory是一个接口,表示IOC容器;而FactoryBean也是一个接口,表示一个特殊的Bean。
  • BeanFactory负责管理和配置所有的Bean;而FactoryBean负责创建和配置某一种或某几种Bean。
  • BeanFactory通过getBean方法返回指定id的Bean实例;而FactoryBean通过getObject方法返回指定类型的对象实例。
  • BeanFactory通过getBean方法返回的对象类型与配置文件中的class属性一致;而FactoryBean通过getObject方法返回的对象类型与配置文件中的class属性不一致,而是由FactoryBean的实现类决定。
  • BeanFactory通过getBean方法返回的对象实例与配置文件中的id属性一致;而FactoryBean通过getObject方法返回的对象实例与配置文件中的id属性不一致,而是由FactoryBean的实现类决定。

五、使用场景

根据上面的区别,我们可以根据不同的需求选择使用BeanFactory或FactoryBean。一般来说,以下几种情况可以使用BeanFactory:

  • 当我们需要使用Spring框架作为IOC容器时,我们可以使用BeanFactory接口或其子接口来获取和操作容器中的Bean。
  • 当我们需要对容器中的Bean进行检索、判断、类型匹配、别名等操作时,我们可以使用BeanFactory接口或其子接口提供的方法来实现。
  • 当我们需要管理容器中的Bean的作用域和生命周期时,我们可以使用BeanFactory接口或其子接口提供的方法来实现。

以下几种情况可以使用FactoryBean:

  • 当我们需要创建复杂或特殊类型的对象时,我们可以使用FactoryBean接口来自定义对象的创建逻辑,避免在配置文件中编写大量的代码。
  • 当我们需要修饰或增强已有类型的对象时,我们可以使用FactoryBean接口来自定义对象的修饰逻辑,提供额外的功能。
  • 当我们需要返回与普通Bean不同类型或不同实例的对象时,我们可以使用FactoryBean接口来自定义对象的返回逻辑,支持单例或多例模式。

总结

本文介绍了FactoryBean和BeanFactory两个与Spring框架相关的重要概念。它们虽然名字相似,但是功能和用法却有很大的区别。通过理解它们的定义,特点,区别和使用场景,我们可以更好地利用Spring框架提供的IOC容器来管理和配置Java对象。

相关文章:

FactoryBean和BeanFactory:Spring IOC容器的两个重要角色简介

目录 一、简介 二、BeanFactory 三、FactoryBean 四、区别 五、使用场景 总结 一、简介 在Spring框架中,IOC(Inversion of Control)容器是一个核心组件,它负责管理和配置Java对象及其依赖关系,实现了控制反转&a…...

微服务中间件--分布式搜索ES

分布式搜索ES 11.分布式搜索 ESa.介绍ESb.IK分词器c.索引库操作 (类似于MYSQL的Table)d.查看、删除、修改 索引库e.文档操作 (类似MYSQL的数据)1) 添加文档2) 查看文档3) 删除文档4) 修改文档 f.RestClient操作索引库1) 创建索引库2) 删除索引库/判断索引库 g.RestClient操作文…...

触摸屏与PLC之间 EtherNet/IP无线以太网通信

在实际系统中,同一个车间里分布多台PLC,用触摸屏集中控制。通常所有设备距离在几十米到上百米不等。在有通讯需求的时候,如果布线的话,工程量较大耽误工期,这种情况下比较适合采用无线通信方式。 本方案以MCGS触摸屏和…...

Crontab定时任务运行Docker容器(Ubuntu 20)

对于一些离线预测任务,或者D1天的预测任务,可以简单地采用Crontab做定时调用项目代码运行项目 Crontab简介: Linux crontab命令常见于Unix和类Unix的操作系统之中,用于设置周期性被执行的指令。该命令从标准输入设备读取指令&…...

Fegin异步情况丢失上下文问题

在微服务的开发中,我们经常需要服务之间的调用,并且为了提高效率使用异步的方式进行服务之间的调用,在这种异步的调用情况下会有一个严重的问题,丢失上文下 通过以上图片可以看出异步丢失上下文的原因是不在同一个线程&#xff0c…...

《Linux从练气到飞升》No.17 进程创建

🕺作者: 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux菜鸟刷题集 😘欢迎关注:👍点赞🙌收藏✍️留言 🏇码字不易,你的👍点赞🙌收藏❤️关注对我真的…...

python + pyside2,pyside6,运行错误

在visual studio code运行pyside的时候报错 qt.qpa.plugin: Could not find the Qt platform plugin “windows“ in 后来发现在cmd命令行可以正常运行,应该是VScode和虚拟机类似的问题。 额外设置一下环境变量就可以了。 执行print(os.path.dirname(PySide6.__f…...

第60步 深度学习图像识别:误判病例分析(Pytorch)

基于WIN10的64位系统演示 一、写在前面 上期内容基于Tensorflow环境做了误判病例分析(传送门),考虑到不少模型在Tensorflow环境没有迁移学习的预训练模型,因此有必要在Pytorch环境也搞搞误判病例分析。 本期以SqueezeNet模型为…...

基于Java+SpringBoot+vue前后端分离夕阳红公寓管理系统设计实现

博主介绍:✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专…...

远控木马病毒分析

一、病毒简介 SHA256:880a402919ba4e896f6b4b2595ecb7c06c987b025af73494342584aaa84544a1 MD5:0902b9ff0eae8584921f70d12ae7b391 SHA1:f71b9183e035e7f0039961b0ac750010808ebb01 二、行为分析 同样在我们win7虚拟机中,使用火绒剑进行监控,分析行为…...

线性代数的学习和整理7:各种特殊效果矩阵汇总

目录 1 矩阵 1.1 1维的矩阵 1.2 2维的矩阵 1.3 没有3维的矩阵---3维的是3阶张量 1.4 下面本文总结的都是各种特殊效果矩阵特例 2 方阵: 正方形矩阵 3 单位矩阵 3.1 单位矩阵的定义 3.2 单位矩阵的特性 3.3 为什么单位矩阵I是 [1,0;0,1] 而不是[0,1;1,0] 或[1,1;1,1]…...

[git]github上传大文件

github客户端最高支持100Mb文件上传,如果要>100M只能用git-lfs,但是测试发现即使用git lfs,我上传2.5GB也不行,测试737M文件可以,GitHub 目前 Git LFS的总存储量为1G左右,超过需要付费。(上传失败时&…...

element ui - el-select获取点击项的整个对象item

1.背景 在使用 el-select 的时候,经常会通过 change 事件来获取当前绑定的 value ,即对象中默认的某个 value 值。但在某些特殊情况下,如果想要获取的是点击项的整个对象 item,该怎么做呢? 2.实例 elementUI 中是可…...

实现SSM简易商城项目的购物车实现

实现SSM简易商城项目的购物车实现 在这篇博客中,我们将使用SSM框架来实现一个简易的购物车功能。我们将使用Spring框架来管理Bean,使用SpringMVC框架来处理HTTP请求,使用MyBatis框架来操作数据库。 实现SSM简易商城项目的购物车功能的思路如…...

【学习FreeRTOS】第17章——FreeRTOS任务通知

1.任务通知的简介 任务通知:用来通知任务的,任务控制块中的结构体成员变量 ulNotifiedValue就是这个通知值。 使用队列、信号量、事件标志组时都需另外创建一个结构体,通过中间的结构体进行间接通信! 使用任务通知时&#xff0c…...

GO-vscode远程开发和调试

本文内容主要包括: 概述: 主要就是把代码放到服务器上然后远程去开发和调试 工具: vscode 远程端: linux 一.安装远程插件 vscode安装Remote - SSH,Remote Explorer,Remote Development&#xff0c…...

【笔记】判断两个Double类型的值是否相同

在Java中,将两个double值转换为String类型,然后使用equals方法进行比较是一个常见的做法,但是这种方法并不是完全可靠,特别是在涉及浮点数的精度时仍然可能会遇到问题。 浮点数在内部以二进制表示,有时会存在舍入误差…...

Linux —— nfs文件系统

简介 NFS 是Network File System的缩写,即网络文件系统。一种使用于分散式文件系统的协定,由Sun公司开发,于1984年向外公布。功能是通过网络让不同的机器、不同的操作系统能够彼此分享个别的数据,让应用程序在客户端通过网络访问位…...

数据降维 | MATLAB实现T-SNE降维特征可视化

数据降维 | MATLAB实现T-SNE降维特征可视化 目录 数据降维 | MATLAB实现T-SNE降维特征可视化降维效果基本描述程序设计参考资料 降维效果 基本描述 T-SNE降维特征可视化,MATLAB程序。 T-分布随机邻域嵌入,主要用途是对高维数据进行降维并进行可视化&…...

蓝桥杯上岸每日N题 (交换瓶子)

大家好 我是寸铁 希望这篇题解对你有用,麻烦动动手指点个赞或关注,感谢您的关注 题目描述 有 N 个瓶子,编号 1∼N,放在架子上。 比如有 5 个瓶子: 2 1 3 5 4 要求每次拿起 2 个瓶子,交换它们的位置。 …...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器

——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的​​一体化测试平台​​,覆盖应用全生命周期测试需求,主要提供五大核心能力: ​​测试类型​​​​检测目标​​​​关键指标​​功能体验基…...

Psychopy音频的使用

Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...

Axios请求超时重发机制

Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式: 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...

均衡后的SNRSINR

本文主要摘自参考文献中的前两篇,相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程,其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt​ 根发送天线, n r n_r nr​ 根接收天线的 MIMO 系…...

C#中的CLR属性、依赖属性与附加属性

CLR属性的主要特征 封装性: 隐藏字段的实现细节 提供对字段的受控访问 访问控制: 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性: 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑: 可以…...

Java数值运算常见陷阱与规避方法

整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...

DingDing机器人群消息推送

文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人,点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置,详见说明文档 成功后,记录Webhook 2 API文档说明 点击设置说明 查看自…...

Razor编程中@Html的方法使用大全

文章目录 1. 基础HTML辅助方法1.1 Html.ActionLink()1.2 Html.RouteLink()1.3 Html.Display() / Html.DisplayFor()1.4 Html.Editor() / Html.EditorFor()1.5 Html.Label() / Html.LabelFor()1.6 Html.TextBox() / Html.TextBoxFor() 2. 表单相关辅助方法2.1 Html.BeginForm() …...

医疗AI模型可解释性编程研究:基于SHAP、LIME与Anchor

1 医疗树模型与可解释人工智能基础 医疗领域的人工智能应用正迅速从理论研究转向临床实践,在这一过程中,模型可解释性已成为确保AI系统被医疗专业人员接受和信任的关键因素。基于树模型的集成算法(如RandomForest、XGBoost、LightGBM)因其卓越的预测性能和相对良好的解释性…...

STM32 低功耗设计全攻略:PWR 模块原理 + 睡眠 / 停止 / 待机模式实战(串口 + 红外 + RTC 应用全解析)

文章目录 PWRPWR(电源控制模块)核心功能 电源框图上电复位和掉电复位可编程电压监测器低功耗模式模式选择睡眠模式停止模式待机模式 修改主频一、准备工作二、修改主频的核心步骤:宏定义配置三、程序流程:时钟配置函数解析四、注意…...