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

Spring FactoryBean 源码讲解

Spring FactoryBean 源码讲解

在这里插入图片描述

什么是Spring FactoryBean

Spring FactoryBean是一个特殊的Bean,它实现了FactoryBean接口并重写了其getObject()方法,用于生产其他Bean的实例。在Spring容器启动时,会自动调用FactoryBean的getObject()方法来获取Bean实例,并将其放入容器中供其他Bean使用。通过FactoryBean可以实现更加灵活的Bean创建方式,例如:动态代理、延迟初始化等。

FactoryBean接口类中的三个接口

在这里插入图片描述

FactoryBean 接口是 Spring 框架中的一个重要接口,它的作用是用于创建和管理 Bean 对象。其中,FactoryBean 接口中定义了以下三个方法:

  1. getObject() 方法:
    该方法用于创建并返回一个 Bean 对象实例。在使用 FactoryBean 接口时,Spring 容器会调用该方法来获取 Bean 实例。示例代码如下:
public class MyFactoryBean implements FactoryBean<MyBean> {@Overridepublic MyBean getObject() throws Exception {// 创建 MyBean 实例return new MyBean();}
}

在上述示例中,MyFactoryBean 类实现了 FactoryBean 接口,并重写了 getObject() 方法。在该方法中,创建并返回了一个 MyBean 对象实例。

  1. getObjectType() 方法:
    该方法用于返回由 FactoryBean 创建的 Bean 对象的类型。在使用 FactoryBean 接口时,Spring 容器会根据该方法返回的类型来判断是否与所需 Bean 的类型匹配。示例代码如下:
public class MyFactoryBean implements FactoryBean<MyBean> {@Overridepublic Class<?> getObjectType() {// 返回 MyBean 类型return MyBean.class;}
}

在上述示例中,MyFactoryBean 类重写了 getObjectType() 方法,并返回了 MyBean 类型。

  1. isSingleton() 方法:
    该方法用于返回由 FactoryBean 创建的 Bean 对象是否为单例模式。在使用 FactoryBean 接口时,Spring 容器会根据该方法返回的值来判断是否为单例模式。示例代码如下:
public class MyFactoryBean implements FactoryBean<MyBean> {@Overridepublic boolean isSingleton() {// 返回 true,表示 MyBean 为单例模式return true;}
}

在上述示例中,MyFactoryBean 类重写了 isSingleton() 方法,并返回了 true,表示 MyBean 为单例模式。

FactoryBean 接口的原理是,当 Spring 容器加载配置文件时,如果发现 Bean 的定义实现了 FactoryBean 接口,就会将其视为一个 FactoryBean,而不是普通的 Bean。然后,Spring 容器会调用 FactoryBean 的 getObject() 方法来获取 Bean 实例,而不是直接使用 Bean 的构造函数或工厂方法来创建实例。这样,我们就可以在 FactoryBean 中实现自己的逻辑,例如根据条件动态创建不同的 Bean 实例、设置一些属性等。

总之,FactoryBean 接口是 Spring 框架中的一个重要接口,它提供了一种灵活的方式来创建和管理 Bean 对象。通过实现 FactoryBean 接口,我们可以自定义 Bean 的创建过程,并对 Bean 进行更细粒度的控制。

FactoryBean 和BeanFactory的区别

FactoryBean 和 BeanFactory 是 Spring 框架中两个不同的概念,它们之间存在以下区别:

  1. 功能不同:

    • FactoryBean:FactoryBean 是一个接口,用于创建和管理 Bean 对象。它提供了更高级别的控制和自定义能力,可以在创建 Bean 实例时执行一些特定逻辑。
    • BeanFactory:BeanFactory 是一个接口,是 Spring 框架中的核心接口之一。它是一个容器,用于管理和获取 Bean 对象。BeanFactory 负责加载、实例化和管理 Bean,提供了基本的 Bean 创建和查找功能。
  2. 使用方式不同:

    • FactoryBean:要使用 FactoryBean 创建和管理 Bean 对象,需要实现 FactoryBean 接口,并实现其中的方法。Spring 容器会将实现了 FactoryBean 接口的类视为一个 FactoryBean,通过调用 getObject() 方法来获取 Bean 实例。
    • BeanFactory:BeanFactory 是 Spring 容器的核心接口,用于加载和管理 Bean 对象。可以通过配置文件、注解或编程方式来定义和配置 BeanFactory。
  3. 返回类型不同:

    • FactoryBean:FactoryBean 的 getObject() 方法返回的是具体的 Bean 实例对象。因为 FactoryBean 可以进行一些自定义逻辑,所以 getObject() 方法返回的对象可能与 FactoryBean 的类型不完全一致。
    • BeanFactory:BeanFactory 的 getBean() 方法返回的是通过 BeanFactory 管理的 Bean 实例对象,其类型与 BeanFactory 中定义的类型一致。
  4. 生命周期不同:

    • FactoryBean:FactoryBean 可以通过实现 InitializingBean 和 DisposableBean 接口或使用 @PostConstruct 和 @PreDestroy 注解来定义初始化和销毁方法,以控制 Bean 的生命周期。
    • BeanFactory:BeanFactory 不直接参与 Bean 的生命周期管理,它只是负责创建和获取 Bean 对象。Bean 的生命周期由 Spring 容器管理,可以通过配置文件或注解来定义初始化和销毁方法。

总结起来,FactoryBean 是一个接口,用于创建和管理 Bean 对象,提供了更高级别的控制和自定义能力;而 BeanFactory 是一个接口,是 Spring 容器的核心接口,用于加载和管理 Bean 对象。FactoryBean 的主要作用是创建和管理 Bean,而 BeanFactory 则是一个容器,负责加载、实例化和管理 Bean。

相关文章:

Spring FactoryBean 源码讲解

Spring FactoryBean 源码讲解 什么是Spring FactoryBean Spring FactoryBean是一个特殊的Bean&#xff0c;它实现了FactoryBean接口并重写了其getObject()方法&#xff0c;用于生产其他Bean的实例。在Spring容器启动时&#xff0c;会自动调用FactoryBean的getObject()方法来获…...

【C语言】零碎知识点|细节

除法运算符(/)的使用规则 在C语言中,除法运算符(/)的使用规则如下: 当两个整数相除时,结果也是一个整数。例如,如果A和B都是整数,那么A / B的结果也是一个整数。这意味着,除法运算的结果会忽略小数部分。例如,10 / 3 的结果是3,而不是3.3333。 当一个整数和一个浮点…...

电影评分数据分析案例-Spark SQL

# cording:utf8from pyspark.sql import SparkSession from pyspark.sql.types import IntegerType, StringType, StructType import pyspark.sql.functions as Fif __name__ __main__:# 0.构建执行环境入口对象SparkSessionspark SparkSession.builder.\appName(movie_demo)…...

vue如何使用冻结对象提升代码效率及其原理解析

先给大家伙整个实际工作中一定会碰到的问题 如下vue dome ,它的代码非常简单功能也1非常简单,就是一个按钮,点击后会显示有多少条数据 来看看源码, html部分就是一个按钮绑定了一个loadData事件,然后在p标签内展示了这个myData这个数据的长度 <template><div id&quo…...

基于深度学习网络的手势识别算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 clc; clear; close all; warning off; addpath(genpath(pwd)); rng(default)load gnet.mat[Pr…...

[论文笔记] 多语言模型中的负干扰研究结果和元学习算法

On Negative Interference in Multilingual Models: Findings and A Meta-Learning Treatment 多语言模型中的负干扰:研究结果和元学习解决办法 概述: 训练语料库大小(训练数据大小和 负干扰 无关)。 语言亲缘关系/语系 和 负干扰 有关。添加相似的语言并不能减轻负面干扰。…...

【OpenVINO】行人摔倒检测 — 基于 OpenVINO C# API 部署PP-Human-下篇

行人摔倒检测 — 基于 OpenVINO C# API 部署PP-Human 4. 配置 PP-Human_Fall_Detection 项目4.1 环境配置4.2 创建 AlxBoard_deploy_yolov8 项目4.3 添加项目源码4.4 添加 OpenVINO C# API4.5 添加 OpenCvSharp 5. 测试 PP-Human_Fall_Detection 项目5.1 创建视频读取器5.2 行人…...

运行报错(三)git bash报错fatal: detected dubious ownership in repository at

报错现象 在运行git 命令时&#xff0c;出现报错 “fatal: detected dubious ownership in repository at” 报错原因 文件夹的所有者和现在的用户不一致 栗子&#xff1a; 文件夹的所有者是root&#xff0c;而当前用户是admin 解决方案 方法一、 将文件夹的所有者替换成ad…...

nvm 的安装及使用

文章目录 一、nvm是什么&#xff1f;二、下载nvm三、在cmd控制台进行操作1、nvm 查询版本号2、查询可以下载的node版本3、安装指定版本4、查看已经安装的node版本5、切换node版本(如果失败那就用管理员身份打开cmd进行切换) 一、nvm是什么&#xff1f; nvm是一个node的版本管理…...

xcode Simulator 安装

xcode Simulator 安装 参考文档 xcode又又又升级了&#xff0c;升级完成之后不下载最新的 iOS 17 Simulator就不能编译运行了&#xff0c;只能静静的等他下载。但是离谱的是这个居然没有断点续下&#xff0c;每次都要重新下载&#xff0c;眼睁睁的看着下载了4个G然后断掉了从…...

【Maven教程】(八):使用 Nexus 创建私服 ~

Maven 使用 Nexus 创建私服 1️⃣ Nexus简介2️⃣ 安装 Nexus2.1 下载 Nexus2.2 Bundle 方式安装 Nexus2.3 WAR 方式安装 Nexus2.4 登录 Nexus 3️⃣ Nexus 的仓库与仓库组3.1 Nexus 内置的仓库3.2 Nexus 仓库分类的概念3.3 创建 Nexus 宿主仓库3.4 创建 Nexus 代理仓库3.5 创…...

螺旋矩阵[中等]

优质博文&#xff1a;IT-BLOG-CN 一、题目 给你一个m行n列的矩阵matrix&#xff0c;请按照顺时针螺旋顺序&#xff0c;返回矩阵中的所有元素。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,2,3],[4,5,6],[7,8,9]] 输出&#xff1a;[1,2,3,6,9,8,7,4,5] 示例 2&#xf…...

babel6使用ES2020最新js语法

babel6使用ES2020最新js语法 Babel 6 原本是不支持 ES2020 语法&#xff0c;因为它是在 Babel 7 中引入的。如果您想使用 ES2020 语法&#xff0c;您需要将 Babel 6 升级到 Babel 7 或更高版本(推荐),当然也可以在bebel6中安装支持某个语法的plugin,比如你想使用 ES2020 中的可…...

【iOS】简单的网络请求

应iOS小组要求&#xff0c;仿写知乎日报需要实现网络请求并解析JSON格式数据&#xff0c;这篇文章仅对基本的网络请求和iOS中的JSON解析作以记录&#xff0c;还涉及到RunLoop的一点小插曲&#xff0c;具体请求过程和原理以后会详细学习&#xff01;&#x1f64f; 基本网络流程简…...

Vulnhub系列靶机---mhz_cxf: c1f

靶机文档&#xff1a;&#xff1a;mhz_cxf: c1f 下载地址&#xff1a;Download (Mirror): 网卡配置 靶机开机后按住shift&#xff0c;出现界面如图&#xff0c;按e键进入安全模式&#xff1a; 找到ro&#xff0c;删除该行后边内容&#xff0c;并将ro 。。。修改为&#xff1a…...

SDRAM与DRAM

SDRAM&#xff08;同步动态随机存取内存&#xff09;和DRAM&#xff08;动态随机存取内存&#xff09;都是RAM的一种类型&#xff0c;但是它们工作的方式有所不同。 DRAM&#xff1a;DRAM是最基础的动态随机存取内存&#xff0c;它的工作方式是总线在内存中读取或写入数据的速度…...

数据库基础(一)【MySQL】

文章目录 安装 MySQL修改密码连接和退出数据库服务器使用 systemctl 管理服务器进程配置数据库从文件角度看待数据库查看连接情况 安装 MySQL 这是在 Linux 中安装 MySQL 的教程&#xff1a;Linux 下 MySQL 安装。本系列测试用的 MySQL 版本是 5.7&#xff0c;机器是 centOS7.…...

C++ -- 位运算与常用库函数(ACWING语法基础)

位运算 & 与 | 或 ~ 非 ^ 异或 >> 右移 << 左移 常用操作&#xff1a; 求x的第k位数字 x >> k & 1lowbit(x) x & -x&#xff0c;返回x的最后一位1 常用库函数、 reverse 翻转 翻转一个vector&#xff1a; reverse(a.begin(), a.end(…...

老卫带你学---leetcode刷题(557. 反转字符串中的单词 III)

557. 反转字符串中的单词 III 问题&#xff1a; 给定一个字符串 s &#xff0c;你需要反转字符串中每个单词的字符顺序&#xff0c;同时仍保留空格和单词的初始顺序。 示例 1&#xff1a;输入&#xff1a;s "Lets take LeetCode contest" 输出&#xff1a;"…...

IEEE754 标准存储浮点数

1. IEEE754 标准简介 IEEE754 标准是一种用于浮点数表示和运算的标准&#xff0c;由国际电工委员会&#xff08;IEEE&#xff09;制定。它定义了浮点数的编码格式、舍入规则以及基本的算术运算规则&#xff0c;旨在提供一种可移植性和一致性的方式来表示和处理浮点数 IEEE754 …...

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...

19c补丁后oracle属主变化,导致不能识别磁盘组

补丁后服务器重启&#xff0c;数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后&#xff0c;存在与用户组权限相关的问题。具体表现为&#xff0c;Oracle 实例的运行用户&#xff08;oracle&#xff09;和集…...

IGP(Interior Gateway Protocol,内部网关协议)

IGP&#xff08;Interior Gateway Protocol&#xff0c;内部网关协议&#xff09; 是一种用于在一个自治系统&#xff08;AS&#xff09;内部传递路由信息的路由协议&#xff0c;主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...

基于当前项目通过npm包形式暴露公共组件

1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹&#xff0c;并新增内容 3.创建package文件夹...

Module Federation 和 Native Federation 的比较

前言 Module Federation 是 Webpack 5 引入的微前端架构方案&#xff0c;允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...

CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云

目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...

Reasoning over Uncertain Text by Generative Large Language Models

https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...

HubSpot推出与ChatGPT的深度集成引发兴奋与担忧

上周三&#xff0c;HubSpot宣布已构建与ChatGPT的深度集成&#xff0c;这一消息在HubSpot用户和营销技术观察者中引发了极大的兴奋&#xff0c;但同时也存在一些关于数据安全的担忧。 许多网络声音声称&#xff0c;这对SaaS应用程序和人工智能而言是一场范式转变。 但向任何技…...

Kubernetes 节点自动伸缩(Cluster Autoscaler)原理与实践

在 Kubernetes 集群中&#xff0c;如何在保障应用高可用的同时有效地管理资源&#xff0c;一直是运维人员和开发者关注的重点。随着微服务架构的普及&#xff0c;集群内各个服务的负载波动日趋明显&#xff0c;传统的手动扩缩容方式已无法满足实时性和弹性需求。 Cluster Auto…...

密码学基础——SM4算法

博客主页&#xff1a;christine-rr-CSDN博客 ​​​​专栏主页&#xff1a;密码学 &#x1f4cc; 【今日更新】&#x1f4cc; 对称密码算法——SM4 目录 一、国密SM系列算法概述 二、SM4算法 2.1算法背景 2.2算法特点 2.3 基本部件 2.3.1 S盒 2.3.2 非线性变换 ​编辑…...