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

2023-10-30

目录

一、简介

二、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对象。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 协助持续进行 Java 到 C# 转换的工具

    如今 许多项目都是用 Java 编写的 其中一些最终转换为 C 以合并到 NET 中 我想到的例子有 log4net nhibernate 和 db4o 包括 Sharpen db4o 的工具 在内 您是否见过和 或使用过任何使连续转换变得
  • java字符串索引越界异常

    从类中调用函数时出现以下错误 java lang StringIndexOutOfBoundsException 字符串索引超出范围 1 尽管我使用系统打印来查看我在 substring 函数中传递的输入 但一切似乎都是正确的 函数 isC
  • 删除 PriorityQueue 的顶部?

    假设我使用 Java util 中的 PriorityQueue 类 我想从 PriorityQueue pq 中删除最大的数字 我们假设它位于队列的头部 下面的工作会起作用吗 1 int head pq peek pq dequeue h
  • 如何使用 Java 本机接口将字节数组传递到以 char* 作为参数的 C 函数中?

    所以我需要使用JNI从java调用C函数 当传入不同的数据类型 创建本机变量 头文件 共享库等等 时 我已经能够成功地做到这一点 但无法让它与字节数组一起使用 这是我的 C 函数 include
  • Powermockito 可以在非最终具体类中模拟最终方法吗?

    假设我有一个非最终具体类 具有如下所示的最终方法 public class ABC public final String myMethod return test test 可以嘲笑吗myMethod 调用时返回其他内容junit usi
  • 无法获取未知属性“运行时”Gradle 7.0

    我最近切换到 gradle 7 0 现在无法构建我的项目 jar 并出现错误 无法获取 org gradle api internal artifacts configurations DefaultConfigurationContain
  • 如何在Intellij IDEA中复制maven依赖项到输出工件WEB-INF/lib?

    我知道在 eclipse maven 中可以将依赖项复制到 WEB INF lib 目录setting Deployment Assembly and Build Path 但是我怎样才能用 Intellij IDEA 实现这一点呢 好的
  • Mac OSX 上使用 Java 7 的透明 JFrame/JWindow

    我们有一个屏幕共享小程序 它打开 Swing JFrame 并使用 Robot 类捕获空框架后面的屏幕 用户可以单击框架并与小程序后面的任何内容进行交互 这在 Windows 上运行良好 并且用于 Apple 的 Java 版本 但对于 M
  • 如何跨工作区保存 E​​clipse 启动配置文件?

    当我复制 Eclipse 项目目录时 它包含 classpath 和 project 文件 这样当我将同一目录带到另一个 Eclipse 实例时 我不必设置我的构建路径等 假设所有资源都包含在在项目中 而不是外部 但是 此过程不会导致启动配
  • 为什么ArrayList没有getSize()而不是size()?

    我在一些 JSP 页面中大量使用 ArrayList 我想像这样访问 ArrayList myArrayList size 但由于对象必须符合 JavaBean 标准 其中myArrayList getMyPropertyName is m
  • 在 Android 上解析 RSS

    我有几个 RSS 源需要为我的应用程序进行解析 我按照这里的优秀教程进行操作 http w2davids wordpress com android rssatom feeds parsing with rome http w2davids
  • Java 会话变量

    我听说有些人认为在会话中将信息存储在服务器上是一个坏主意 因为它不安全 因此 在多页面业务流程功能中 应用程序将数据写入数据库 然后在需要时检索信息 在会话中存储私人信息是否一定不安全 只要会话本身安全 在会话中存储属性就不存在安全风险劫持
  • 如何更改使用 Google ReCaptcha 版本 2 时的错误消息?

    当为 Google ReCaptcha 版本 2 选择多张照片时 会显示以下错误消息 需要多个正确的解决方案 请解决更多 如何将错误消息更改为我网站上的自定义消息 这是图像 我认为不可能在服务器端 在谷歌 进行 这可以在客户端通过利用 js
  • 为什么我用Java计算的结果是错误的?

    我使用这段代码来计算一些东西 但几乎在所有情况下结果都是 0 0 为什么 编译器中没有警告或错误 private void jButton1ActionPerformed java awt event ActionEvent evt try
  • 使用 spring mvc 的多个域

    假设我有一个应用程序必须缩短 URL 但还要执行其他操作 喜欢google com and goo gl or facebook com and fb me 部署两个应用程序很容易 但 目前 仅部署一个应用程序更简单 使用 spring 和
  • 应返回带有 html 代码的字符串的支持 bean 属性返回空字符串

    我的支持 bean 中有一个返回 html 代码的属性 public String getHtmlPrevisualizar return Hello world 我想要做的是在 iframe 中显示这个 html 代码 我用 JavaSc
  • 清单合并失败:需要为 显式指定 android:exported

    我的清单文件有问题 错误消息 清单合并失败 android 需要为 明确指定导出 面向 Android 12 及更高版本的应用需要指定显式值android exported当相应的组件定义了意图过滤器时 有关详细信息 请参阅 https d
  • 使用用户名和密码登录 LinkedIn 失败

    LinkedIn使用oauth登录其api 服务器中无法登录api 我尝试使用http请求登录linkedin并获取oauth verifier 但我得到了这样的回应 很抱歉 出现了问题 你的申请 请确保您 启用cookie并重试 或点击此
  • 无法读取使用 DataOutputStream 发送的号码

    这是我的客户端代码 Random rand new Random int n rand nextInt 50 1 DataInputStream dis new DataInputStream socket getInputStream D
  • 尝试 Catch 性能 Java

    当捕获异常而不是进行检查时 try catch 需要多长时间 以纳秒为单位 假设消息具有用于查找的 HashMap 类型性能 try timestamp message getLongField MessageField TIMESTAMP

随机推荐

  • zabbix的安装配置及基本使用

    一 zabbix的安装 1 最小化安装操作系统 安装以下常用依赖包 yum install vim iotop bc gcc gcc c glibc glibc devel pcre pcre devel openssl openssl d
  • qcustomplot绘制动态曲线_第十讲 频域分析法(Nyquist曲线)

    金鸡一唱天下白 第九讲 根轨迹法 zhuanlan zhihu com 自动化人 知乎 www zhihu com 概述 频域 频率响应 分析法是研究控制系统的一种工程方法 典控制理论最重要 最主要的分析方法 应用系统的频率特性可以间接地分
  • 获取在本地缓存

    我们有时候需要获取在本地缓存 在这个时候我们大部分朋友们做不到 今天我找到啦这个的好办法 现在分享给你们 第一步 如果我们已登录并保存缓存的话 我们可以直接看下面的代码 这个是在我们需要的js里面获取缓存的数据 第二步 如果你还没完成登录并
  • 《计算机网络》——第四章知识点

    五类题型1 已知主机IP地址和子网掩码 求网络号2 已知主机IP地址和子网掩码 求子网 主机最多有多少个 3 已知网络号 X位子网号 求子网掩码4 已知网络号 要分成X个子网 求子网掩码和IP地址范围 5 已知子网掩码 求哪些IP地址属于同
  • 操作系统考研复习——第五章(设备管理)

    操作系统考研复习 第五章 设备管理 5 输入 输出 I O管理 5 1 I O管理概述 5 1 1 I O设备 1 什么是I O设备 2 I O设备的分类 按使用特性 3 I O设备的分类 按传输速率分类 4 I O设备的分类 按信息交换的
  • 人机(AI)四人斗地主

    最近在使用Cocos Creator做一款四人斗地主的手机游戏 半成品 仅前端 代码附在最后 仅供参考 游戏中的单机 人机 模式以及游戏过程中的托管都需要出牌算法的设计 因此借这篇博客梳理一下现有的一些思路 首先 明确 AI出牌算法的目的是
  • 使用cmd命令行启动asp.net core 以及.net 5项目

    asp net core 通过CMD命令启动
  • 在 JavaScript 中将字符串转换为数字的 7 种方法

    1 使用 parseInt parseInt 解析一个字符串并返回一个整数 允许空格 仅返回第一个数字 这种方法虽然有一个限制 如果您解析十进制数 它将四舍五入到最接近的整数值 并将该值转换为string 可能需要使用parseFloat
  • antd tree树形控件 onCheck单选并准确获取父子节点

    antd 的tree树形控件为什么没有单选属性 还是我眼瞎没找到 需求 一个只能单选的tree树形控件 并且点击选中一个节点返回当前节点信息和父节点信息 看上去很普通的需求 但是实现起来真的麻烦 就因为tree的onCheck没有单选的问题
  • EDA软件_Cadence_OrCAD Capture DRC 警告分析

    大多数DRC warning甚至某些error可以忽略不计 不影响生成网表 但是要想成为一名成熟的电子工程师 你可以忽略某些错误 但是必须懂得为什么会产生这些错误 如何消除掉这些错误 这样才能控制这些错误的作用范围 不致影响系统整体的设计
  • django.core.exceptions.ImproperlyConfigured: Requested setting DEFAULT_INDEX_TABLESPACE, but setting

    django core exceptions ImproperlyConfigured Requested setting DEFAULT INDEX TABLESPACE but settings are not configured Y
  • 微信小程序 富文本编辑器 editor

    完整微信小程序 Java后端 技术贴目录清单页面 必看 富文本编辑器 可以对图片 文字进行编辑 编辑器导出内容支持带标签的 html和纯文本的 text 编辑器内部采用 delta 格式进行存储 通过setContents接口设置内容时 解
  • React Native Hook浅析——state处理

    前言 前提知识 函数式组件在每次props state变动时 都会重新执行整个函数 重新渲染页面 在使用React的class组件时 我们可以使用state this xxx 以及生命周期 componentDidMount compone
  • 常用的免费好用的DNS有哪些?

    阿酷TONY 原创文章 关键词 免费dns 百度dns 阿里dns 114 dns Google DNS 2019 1 24 DNS Domain Name Server 域名服务器 是进行域名 domain name 和与之相对应的IP地
  • 通讯协议057——全网独有的OPC HDA知识一之接口(十二)IOPCHDA_DataCallback

    本文简单介绍OPC HDA规范的IOPCHDA DataCallback 客户端接口 接口方法 更多通信资源请登录网信智汇 wangxinzhihui com 1 HRESULT OnDataChange dwTransactionID h
  • qt应用程序界面控件刷新不及时问题

    可尝试以下方法 1 void showEvent QShowEvent event this gt setAttribute Qt WA Mapped QWidget showEvent event 2 界面控件切换前调用 show qAp
  • 隐私信息检索(PIR)

    隐私信息检索 Private Information Retrieval PIR 技术是由Chor B等提出解决保护用户查询隐私的方案 主要目的是 保证查询用户在向服务器上的数据库提交查询请求 在用户查询隐私信息不被泄漏的条件下完成查询 即
  • 数据仓库ETL技术探究

    ETL概述 在构建商业智能系统的时候 如何正确有效地将分散在各个不同数据源中的信息整合到系统中成为了整个系统成败的关键 直接影响到系统的运行效率和最终结果 ETL正是解决这一问题的有力工具 ETL是指把数据从数据源装人数据仓库的过程 即数据
  • three.js 没有投影

    按照demo physics oimo instancing html 敲的 不知道问题出现在哪儿
  • FactoryBean和BeanFactory:Spring IOC容器的两个重要角色简介

    目录 一 简介 二 BeanFactory 三 FactoryBean 四 区别 五 使用场景 总结 一 简介 在Spring框架中 IOC Inversion of Control 容器是一个核心组件 它负责管理和配置Java对象及其依赖