Spring BeanFactory FactoryBean的区别?

news2024/11/16 4:48:26

文章目录

  • 前言
  • 一、BeanFactory
  • 二、FactoryBean


前言

面试中被问到过Spring BeanFactory FactoryBean的区别?当时没答上来,感觉这就是一个文字游戏,后面仔细的了解了一下,分享给大家。


在这里插入图片描述

一、BeanFactory

在 Spring 中最核心的就是 Ioc 容器,它保存了所有需要对外提供的 Bean 的实例。Spring 对外暴露的 ApplicationContext作为 IoC 容器最重要的接口,它也实现了 BeanFactory 接口。

所以,BeanFactory 从名字上来看,它是一个 Factory,相当于是 IoC 容器的顶级接口,是 IoC 容器最基础的实现。也是提供访问 Spring 容器的跟接口,主要负责 Bean 的创建和
访问。其中,最主要的一个方法就是 getBean()。同时,在BeanFactory 中还会完成对 Bean 的依赖注入,也就是 DI。

public interface BeanFactory {

	//对FactoryBean的转义定义,因为如果使用bean的名字检索FactoryBean得到的对象是工厂生成的对象,
	//如果需要得到工厂本身,需要转义
	String FACTORY_BEAN_PREFIX = "&";

	//根据bean的名字,获取在IOC容器中得到bean实例
	Object getBean(String name) throws BeansException;

	//根据bean的名字和Class类型来得到bean实例,增加了类型安全验证机制。
	<T> T getBean(String name, @Nullable Class<T> requiredType) throws BeansException;

	Object getBean(String name, Object... args) throws BeansException;

	<T> T getBean(Class<T> requiredType) throws BeansException;

	<T> T getBean(Class<T> requiredType, Object... args) throws BeansException;

	//提供对bean的检索,看看是否在IOC容器有这个名字的bean
	boolean containsBean(String name);

	//根据bean名字得到bean实例,并同时判断这个bean是不是单例
	boolean isSingleton(String name) throws NoSuchBeanDefinitionException;

	boolean isPrototype(String name) throws NoSuchBeanDefinitionException;

	boolean isTypeMatch(String name, ResolvableType typeToMatch) throws NoSuchBeanDefinitionException;

	boolean isTypeMatch(String name, @Nullable Class<?> typeToMatch) throws NoSuchBeanDefinitionException;

	//得到bean实例的Class类型
	@Nullable
	Class<?> getType(String name) throws NoSuchBeanDefinitionException;

	//得到bean的别名,如果根据别名检索,那么其原名也会被检索出来
	String[] getAliases(String name);
}

二、FactoryBean

那 FactoryBean 呢? 从名字上来看它是一个特殊的 Bean,这个 Bean 可以返回创建 Bean 的工厂。如果 FactoryBean 接口,可以根据不同的配置类型返回不同类型的 Bean,它有一个比较核心的方法叫做 getObject()。

FactoryBean 在使用上也有些特殊。在前面介绍的BeanFactory 中,有一个常量叫做
FACTORY_BEAN_PREFIX = “&”,当我们想要从 Spring 容器中获取创建 Bean 的 Factory 时,可以在 beanName 前面加上 & 符号就可以获得 Bean 对应的 Factory。
我们也可以自定义 FactoryBean,用它来扩展创建 Bean的规则。在 Spring 中创建的 AOP 动态代理 Bean,就是通过实现 FactoryBean 来实现的。我们现在用的 Spring Boot、Spring Cloud 也经常通过实现 FactoryBean 接口实现自定义组件,从而修改默认的创建 Bean 的规则。

public interface FactoryBean<T> {

	//从工厂中获取bean
	@Nullable
	T getObject() throws Exception;

	//获取Bean工厂创建的对象的类型
	@Nullable
	Class<?> getObjectType();

	//Bean工厂创建的对象是否是单例模式
	default boolean isSingleton() {
		return true;
	}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/707888.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

GDB 断点管理

1、b 设置断点 usage 1: b 函数名 usage 2: b 文件名:行号 2、rb 函数名关键字 &#xff1a; 所有带有这个关键字的函数名都设置为断点 (gdb) rb dkauth Breakpoint 7 at 0x34187ae0: file /home/jintao/cvf/apps/cvf/services/dkauth/src/dkauth.c, line 58. void dkauth_…

Python之花舞盛宴:探索列表与元组之美与妙用

前言 在Python编程世界中&#xff0c;列表和元组是两个最常用的数据结构之一。无论是初学者还是经验丰富的开发者&#xff0c;对于这两个数据类型的掌握都至关重要。 列表和元组都是用于存储多个值的容器&#xff0c;但它们在性质和特性上有所不同。列表是可变的&#xff0c;…

VMIC-pci-5565反射内存的优势

优势&#xff1a; &#xff08;1&#xff09;实现远程互连的能力 随着仿真实验复杂度的提高&#xff0c;需要多楼宇多试验室间设备的远程互连&#xff0c;通过单模光纤及光纤HUB将远距离的试验室设备进行连接&#xff0c;单模光纤支持的传输距离可达20km。对于距离300m以内的试…

免费搭建一个有脾气的聊天机器人,1行Python代码就够了!

大家好&#xff0c;这里是程序员晚枫。 之前在小破站&#xff1a;Python自动化办公社区给大家免费分享了用Python制作一个wx机器人&#xff0c;1行代码人人可用&#xff0c;很多人还想要免费的智能聊天功能。 今天终于开发出来了&#xff0c;让我们一起看一下&#xff0c;如何…

第四课—大学英语四六级备考—听力专项

Key Words 1.monarch n.君主政治 非常抱歉误解了您的问题。以下是关于"monarch"这两个意义的常见用法、造句和固定搭配的例子&#xff1a; 1. Monarch&#xff08;君主&#xff09;&#xff1a; - 造句&#xff1a; - The monarch of the country made an…

爆文:硬件工程师如何零基础入门?

大家好&#xff0c;我是记得诚。 最近老是有读者问我学习路线&#xff0c;之前其实写过一篇文章&#xff1a; 硬件工程师如何零基础入门&#xff1f;&#xff08;点击阅读&#xff09; 觉得很有必要再发一遍&#xff0c;这篇文章&#xff0c;在全网也算爆文了。 在CSDN有65…

SpringBoot项目中PageHelper给子查询做分页

目录 1.起因 2.sql改进 3.改造pagehelper 4.新的问题 方案一 方案二 方案三(终极) 5.附上pagehelper官方使用指南 1.起因 项目中有个查询非常慢,查询第一页都很慢, sql为一张大表A left join了许多张基础数据表(小表), select * from A left join b on xxx left join…

安全、环保的随身“数据库”——体验希捷锦系列移动硬盘

移动硬盘不属于那种技术更新换代快、差异化明显的产品&#xff0c;因此消费者在选购时关注的点无外乎容量、价格、外观、传输速度以及数据安全等方面。希捷新推出的锦系列移动硬盘&#xff0c;就聚焦数据安全&#xff0c;同时在选材上贯彻了环保理念&#xff0c;设计方面也值得…

Linux限制用户使用特权-限制su

Linux下&#xff0c;允许普通用户通过su命令切换到root身份进行操作。 相对于直接使用root登录操作&#xff0c;这钟方法要安全些。但仍存在安全隐患。 缩小特权使用用户的范围&#xff0c;无疑是更安全的做法。 Linux提供了这样的设置。 编辑/etc/pam.d/su文件&#xff0c…

ai绘画工具有免费的吗?3款ai画图工具分享

在ai绘画工具问世之后&#xff0c;我试验了各种软件&#xff0c;有的功能太过简单&#xff0c;无法满足我对创作的要求&#xff1b;有的则要求我花费大额费用才能享受完整的功能。这让我在探索过程中一度怀疑是否真的有免费软件能够满足我的需求。 然而功夫不负有心人&#xf…

MySQL数据库——MHA高可用

MySQL数据库——MHA高可用 一、MHA概述1&#xff0e;什么是 MHA2&#xff0e;MHA 的组成3&#xff0e;MHA 的特点 二、搭建 MySQL MHA1.Master、Slave1、Slave2 节点上安装 mysql5.72&#xff0e;修改 Master、Slave1、Slave2 节点的主机名&#xff0c;添加主从mysql的映射关系…

数据结构--栈的引用--前中后缀表达式(后部分)

数据结构–栈的引用–前中后缀表达式(后部分) 中缀表达式转后缀表达式&#xff08;手算) 中缀转后缀 \color{purple}中缀转后缀 中缀转后缀的 手算方法 \color{purple}手算方法 手算方法: ①确定中缀表达式中 各个运算符的运算顺序 \color{red}各个运算符的运算顺序 各个运算符…

编程手记【2023-6-25-2023-6-30】

1、Call to ‘toArray()’ with pre-sized array argument ‘new Integer[list.size()]’ 问题&#xff1a; // 将List转为数组 List<Integer> list Arrays.asList(1,2,3,4,5,6); Integer[] array list.toArray(new Integer[list.size()]); System.out.println(Array…

《移动互联网技术》 第二章 无线网络技术: 掌握各种近距离通信的基本概念和工作原理

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…

ECShop 权限管理

如何增加一个新的权限 1、配置菜单所对应的权限code admin/includes/inc_priv.php $purview[02_cost_list] cost_list; 2、配置菜单的语言 languages/zh_cn/admincommon.php $_LANG[02_cost_list] 成本明细; 3、配置权限code的语言 languages/zh_cn/admin/priv_action.p…

制作电子宣传册详细教程?掌握技巧,让你0基础也能上手

企业电子宣传册是现代企业进行品牌推广和宣传的重要手段&#xff0c;随着互联网的发展&#xff0c;越来越多的企业开始使用电子宣传册来替代传统的纸质宣传册。电子宣传册可以通过互联网&#xff0c;微信公众号等传播渠道进行发布和传播&#xff0c;可以更加快速、便捷地传递企…

碳排放预测模型 | Python实现基于LR线性回归的碳排放预测模型

文章目录 效果一览文章概述研究内容源码设计参考资料效果一览 文章概述 碳排放预测模型 | Python实现基于LR线性回归的碳排放预测模型 研究内容 碳排放被认为是全球变暖的最主要原因之一。 该项目旨在提供各国碳排放未来趋势的概述以及未来十年的全球趋势预测。 其方法是分析这…

二叉树刷题总结

题单&#xff1a; 一&#xff0c;相同的树 题目&#xff1a; 给你两棵二叉树的根节点 p 和 q &#xff0c;编写一个函数来检验这两棵树是否相同。 如果两个树在结构上相同&#xff0c;并且节点具有相同的值&#xff0c;则认为它们是相同的。 题目接口&#xff1a; /*** Defin…

Tensorflow神经网络模型-鲜花种类识别

必应壁纸供图 Tensorflow神经网络模型-鲜花种类识别 数据集&#xff1a;https://download.csdn.net/download/weixin_53742691/87982215 导入相关依赖 import warnings import re from IPython.display import clear_output, display from tkinter import Tk, filedialog fro…

无序中的秩序之美:集合数据为编程世界增添新的维度

文章目录 集合数据简介集合数据特点常见的集合数据类型1. 列表&#xff08;List&#xff09;2. 元组&#xff08;Tuple&#xff09;3. 集合&#xff08;Set&#xff09;4. 字典&#xff08;Dictionary&#xff09; 集合数据简介 集合数据是指将多个元素组合在一起的数据结构。…