BeanFactory与FactoryBean区别
1. BeanFactory
BeanFactory,以Factory结尾,表示它是一个工厂类(接口),用于管理Bean的一个工厂。在Spring中,BeanFactory是IOC容器的核心接口,也是最顶层的定义。它的职责包括:实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。
接口里面有如下方法:
- Object getBean(String name) 返回给定名称注册的bean实例。根据bean的配置情况,如果是singleton模式将返回一个共享实例,否则将返回一个新建的实例,如果没有找到指定bean,该方法可能会抛出异常
- <T> T getBean(String name, Class<T> requiredType) 返回以给定名称注册的bean实例,并转换为给定class类型
- <T> T getBean(Class<T> requiredType) 返回以给定名称注册的bean实例,并转换为给定class类型,如果检索出不是唯一个bean,会抛异常(找不到bean异常或bean不是唯一异常)
- Object getBean(String name,Object... agrs) 返回以给定名称注册的bean实例,并且将当前的参数agrs覆盖默认值(如果有的话),该实例需要通过一个工厂类静态方法来产生,且要求是原型模式
class ExampleBean {
private String string;
public ExampleBean(String string) {
this.string = string;
}
} class ExampleBeanFactory {
public static ExampleBean createExampleBean(String string) {
return new ExampleBean(string);
}
} <bean id="exampleBean" class="...ExampleBeanFactory" scope="prototype"
factory-method="createExampleBean">
<constructor-arg value="default value"/>
</bean> public class Main {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext(
"context.xml");
ExampleBean exampleBean =
ExampleBean)context.getBean("exampleBean",
new Object[]{"bla bla"});
exampleBean.write();
}
}- <T> T getBean(Class<T> requiredType,Object... agrs) 返回以给定class注册的bean实例,并且将当前的参数agrs覆盖默认值(如果有的话),该实例需要通过一个工厂类静态方法来产生,且要求是原型模式
- boolean containsBean(String beanName) 判断工厂中是否包含给定名称的bean定义,若有则返回true
- boolean isSingleton(String name) 判断给定名称的bean定义是否为单例模式
- boolean isProtoType(String name) 判断给定名称的bean定义是否为原型模式
- boolean isTypeMatch(String name,ResolvableType typeToMatch) 判断给定名称的bean定义是否是给定的类型
- boolean isTypeMatch(String name,Class<?> typeToMatch) 判断给定名称的bean定义是否是给定的类型
- String[] getAliases(String name) 返回给定bean名称的所有别名
- Class getType(String name) 返回给定名称的bean的Class,如果没有找到指定的bean实例,则排除NoSuchBeanDefinitionException异常
2. FactoryBean
一般情况下,Spring通过反射机制利用bean的class属性指定实现类来实例化bean 。在某些情况下,实例化bean过程比较复杂,如果按照传统的方式,则需要在<bean>中提供大量的配置信息,配置方式的灵活性是受限的,这时采用编码的方式可能会得到一个简单的方案。Spring为此提供了一个org.Springframework.bean.factory.FactoryBean的工厂类接口,用户可以通过实现该接口定制实例化bean的逻辑。根据该Bean的ID从BeanFactory中获取的实际上是FactoryBean的getObject()返回的对象,而不是FactoryBean本身,如果要获取FactoryBean对象,请在id前面加一个&符号来获取。
- TgetObject():返回由FactoryBean创建的Bean实例,如果isSingleton()返回true,则该实例会放到Spring容器中单实例缓存池中;
- booleanisSingleton():返回由FactoryBean创建的Bean实例的作用域是singleton还是prototype;
- Class<T>getObjectType():返回FactoryBean创建的Bean类型。
3. 区别
BeanFactory是个Factory,也就是IOC容器或对象工厂,FactoryBean是个Bean。在Spring中,所有的Bean都是由BeanFactory(也就是IOC容器)来进行管理的,包括FactoryBean。但对FactoryBean而言,这个Bean不是简单的Bean,而是一个能生产或者修饰对象生成的工厂Bean,它的实现与设计模式中的工厂模式和修饰器模式类似。FactoryBean每次只要将持有的对象引用返回即可。
BeanFactory与FactoryBean区别的更多相关文章
- 一文读懂BeanFactory和FactoryBean区别
一直以来,很多人对于Spring中的BeanFactory和FactoryBean都是分不清楚的 BeanFactory 这个其实是所有Spring Bean的容器根接口,给Spring 的容器定义一 ...
- BeanFactory和FactoryBean的区别
转自:http://blog.csdn.net/wangbiao007/article/details/53183764 1.BeanFactory BeanFactory是IOC最基本的容器,负责生 ...
- Spring BeanFactory与FactoryBean的区别及其各自的详细介绍于用法
Spring BeanFactory与FactoryBean的区别及其各自的详细介绍于用法 1. BeanFactory BeanFactory,以Factory结尾,表示它是一个工厂类(接口),用于 ...
- Spring中BeanFactory与FactoryBean的区别
在Spring中有BeanFactory和FactoryBean这2个接口,从名字来看很相似,比较容易搞混. 一.BeanFactory BeanFactory是一个接口,它是Spring中工厂的顶层 ...
- BeanFactory 和FactoryBean的区别
转自:https://www.cnblogs.com/aspirant/p/9082858.html BeanFacotry是spring中比较原始的Factory.如XMLBeanFactory就是 ...
- Spring中BeanFactory与FactoryBean到底有什么区别?
一.BeanFactory BeanFactory是一个接口,它是Spring中工厂的顶层规范,是SpringIoc容器的核心接口,它定义了getBean().containsBean()等管理Bea ...
- 转:BeanFactory和FactoryBean的区别
一.BeanFactory简介 BeanFacotry是spring中比较原始的Factory.如XMLBeanFactory就是一种典型的BeanFactory.原始的BeanFactory无法支持 ...
- 【Java面试】Spring中 BeanFactory和FactoryBean的区别
一个工作了六年多的粉丝,胸有成竹的去京东面试. 然后被Spring里面的一个问题卡住,唉,我和他说,6年啦,Spring都没搞明白? 那怎么去让面试官给你通过呢? 这个问题是: Spring中Bean ...
- Difference between BeanFactory and FactoryBean in Spring Framework (Spring BeanFactory与Factory区别)
参见原文:http://www.geekabyte.io/2014/11/difference-between-beanfactory-and.html geekAbyte Codes and Ran ...
- Spring BeanFactory 与 FactoryBean 的区别
BeanFactory 和 FactoryBean 都是Spring Beans模块下的接口 BeanFactory是spring简单工厂模式的接口类,spring IOC特性核心类,提供从工厂类中获 ...
随机推荐
- vue中标签的替换以及scoped实现css对当前文件起作用的原理
1,vue的工作原理其实就是我们前端拿到组件模板(也就是编译打包后生成的js文件,由vue动态生成html标签以及异步请求服务器的数据,更新html页面展示给用户) 如上图所示,public文件夹下的 ...
- PCIe收发卡设计资料:611-基于VU9P的2路4Gsps AD 2路5G DA PCIe收发卡
基于VU9P的2路4Gsps AD 2路5G DA PCIe收发卡 一.板卡概述 基于XCVU9P的5Gsps AD DA收发PCIe板卡.该板卡要求符合PCIe 3.0标准,包含一片XCVU9P-2 ...
- .NET在单台Windows2008下百万TCP连接测试
测试客户端: 客户端程序建立TCP连接,发送一条几个字节的数据. 虚拟机8台,PC机8台,服务器1台. 设置MaxUserPort=60000,有一台机没有设置约在1.5万左右.最后因为差一点到100 ...
- Centos系统修改时间临时和永久生效
Centos系统,必须同时修改系统时间和硬件时间,才可以保证修改有效,单纯的使用date命令修改系统时间,是立即生效,重启后系统还原.具体操作如下: 1.date命令 {查看和修改目前系统本地的时间} ...
- js循环中删除数组中的某个元素
(1)使用js中的splice方法循环删除数组中某个值 eg: var arr=new Array(); arr.push(1); arr.push(2); arr.push(3); arr.push ...
- Flutter开发 备用网站地址
Flutter开发之环境配置_移动开发_System.o的博客-CSDN博客: https://blog.csdn.net/lyh1299259684/article/details/80505185 ...
- ubuntu 20.04 基于kubeadm部署kubernetes 1.22.4集群—报错解决
一.添加node节点,报错1 注:可以提前在各node节点上修改好(无报错无需执行此项) yang@node2:~$ sudo kubeadm join 192.168.1.101:6443 --to ...
- SQL server 清空数据库所有表
use [数据库名]GOdeclare @sql varchar(8000)while (select count(*) from sysobjects where type='U')>0beg ...
- 如何保证RabbitMQ不会被重复消费?
为什么会有重复消费? 做一个标志! 在将生产者写消息的时候,对数据做一个唯一标识.消费者在消费消息时,根据这个唯一标识做判断,如果这个唯一标识被消费过了,那么就 不消费了,如果判断结果是没有被消费过, ...
- 打车起步价8元(3KM以内) 超过3KM,超出的每公里1.2元 超过5KM,超出的每公里1.5元 请在键盘上接收公里数,得出总价。
import java.util.Scanner; public class Taxi { public static void main(String []agrs){ Scanner s = ne ...