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特性核心类,提供从工厂类中获 ...
随机推荐
- 3. Tooltip 工具提示
1 <!DOCTYPE html> 2 <html lang="zh"> 3 <head> 4 <meta charset="U ...
- Oracle 临时表空间暴满的原因与解决方法
Oracle临时表空间主要用来做查询和存放一些缓冲区数据.临时表空间消耗的主要原因是需要对查询的中间结果进行排序. 重启数据库可以释放临时表空间,如果不能重启实例,而一直保持问题sql语句的执行,te ...
- linux 设置开机自动挂载文件系统
一./etc/ 下增加rc.local文件(ubuntu默认没有这个文件) kuaibang@face:~$ sudo touch rc.local 二.安装NFS客户端 a.如果您使用CentOS. ...
- HCIP-ICT实战进阶04-ISIS原理与配置
HCIP-ICT实战进阶04-ISIS原理与配置 0 前言 IS-IS(Intermediate System to Intermediate System, 中间系统到中间系统)协议, 和OSPF一 ...
- CCF 202012-1 期末预测之安全指数
#include <iostream> //#include <bits/stdc++.h> #include <string> using namespace s ...
- 使用C++进行冒泡排序
#include "pch.h" #include <iostream> using namespace std;手动输入10个数,进行冒泡排序 int main() ...
- Leetcode——二分法bisect_left,bisect_right
!前提--列表有序 case 1 如果列表中没有元素x,那么bisect_left(ls, x)和bisec_right(ls, x)返回相同的值,该值是x在ls中"合适的插入点索引,使得数 ...
- 【逆向】使用IDA Python脚本自动化解密字符串数据
前言 一个肚脑虫(Donot)APT组织的下载器样本,样本中的一些关键字符串数据需要使用指定函数进行动态解密.所以正好借此机会记录下怎么使用IDA Python脚本来解密字符串数据.使用IDA Pyt ...
- go两种数据类型的区别、数据类型和操作符、常量、变量声明
值类型和引用类型 1.值类型:变量直接存储值,内存通常在栈中分配. 基本数据类型int.float.bool.string以及数组和struct. 2.引用类型:变量存储的是一个地址,这个地址存储最终 ...
- defer、panic、recover
defer(延迟执行语句) 多个延迟执行语句的处理顺序 package main import ( "fmt" ) func main() { fmt.Println(" ...