FactoryBean和BeanFactory

FactoryBean和BeanFactory

1 BeanFactory

BeanFactory是Spring里面最底层的接口,它是Spring中工厂的顶层规范, 包含了各种Bean的定义,读取bean配置文档,管理bean的加载、实例化,控制bean的生命周期,维护bean之间的依赖关系。
BeanFactory接⼝是容器的顶级接⼝,定义了容器的⼀些基础⾏为,负责⽣产和管理Bean的⼀个⼯⼚。
具体使⽤它下⾯的⼦接⼝类型,⽐如ApplicationContext;

BeanFactory,以Factory结尾,表示它是⼀个⼯⼚类(接⼝), 它负责⽣产和管理bean的⼀个⼯⼚。
在Spring中,BeanFactory是IOC容器的核⼼接⼝,它的职责包括:
**实例化、定位、配置应⽤程序中的对象及建⽴这些对象间的依赖。**

BeanFactory只是个接⼝,并不是IOC容器的具体实现,但是Spring容器给出了很多种实现,如:
DefaultListableBeanFactory、XmlBeanFactory、ApplicationContext等.
其中XmlBeanFactory就是常⽤的⼀个,该实现将以XML⽅式描述组成应⽤的对象及对象间的依赖关系。
XmlBeanFactory类将持有此XML配置元数据,并⽤它来构建⼀个完全可配置的系统或应⽤。

都是附加了某种功能的实现。它为其他具体的IOC容器提供了最基本的规范,例如
DefaultListableBeanFactory,XmlBeanFactory,ApplicationContext 等具体的容器都是实现了BeanFactory,再在其基础之上附加了其他的功能。

BeanFactory和ApplicationContext就是spring框架的两个IOC容器。
现在⼀般使⽤ApplicationnContext,其不但包含了BeanFactory的作⽤,同时还进⾏更多的扩展。


BeanFacotry是spring中⽐较原始的Factory。如XMLBeanFactory就是⼀种典型的BeanFactory。.
原始的BeanFactory⽆法⽀持spring的许多插件,如AOP功能、Web应⽤等。ApplicationContext接⼝,它由BeanFactory接⼝派⽣⽽来,
ApplicationContext包含BeanFactory的所有功能,通常建议⽐BeanFactory优先

ApplicationContext以⼀种更向⾯向框架的⽅式⼯作以及对上下⽂进⾏分层和实现继承,
ApplicationContext包还提供了以下的功能:

 - MessageSource, 提供国际化的消息访问
 - 资源访问,如URL和⽂件
 - 事件传播
 - 载⼊多个(有继承关系)上下⽂ ,使得每⼀个上下⽂都专注于⼀个特定的层次,⽐如应⽤的web层;
BeanFactory提供的⽅法及其简单,仅提供了六种⽅法供客户调⽤:

 - boolean containsBean(String beanName) 判断⼯⼚中是否包含给定名称的bean定义,若有 则返回true
 - Object getBean(String) 返回给定名称注册的bean实例。根据bean的配置情况,如果是
 - singleton模式将返回⼀个共享实例,否则将返回⼀个新建的实例,如果没有找到指定bean,该⽅法 可能会抛出异常 Object
 - getBean(String, Class) 返回以给定名称注册的bean实例,并转换为给定class类型 Class
 - getType(String name) 返回给定名称的bean的Class,如果没有找到指定的bean实例,则排除NoSuchBeanDefinitionException异常
 - boolean isSingleton(String) 判断给定名称的bean定义是否为单例模式 String[] getAliases(String name) 返回给定bean名称的所有别名

2 FactoryBean

FactoryBean 也是接口,为IOC容器中Bean的实现提供了更加灵活的方式,FactoryBean在IOC容器的基础上给Bean的实现加上了一个简单的工厂模式和装饰模式 ,我们可以在getObject()方法中灵活配置.
FactoryBean是一个Bean,实现了FactoryBean接口的类有能力改变bean,类似于普通bean的一个装饰器,普通的bean对象可以通过实现FactoryBean接口,对bean进行改造。
FactoryBean也是接⼝,为IOC容器中Bean的实现提供了更加灵活的⽅式,FactoryBean在IOC容器的基
础上给Bean的实现加上了⼀个简单⼯⼚模式和装饰模式。
FactoryBean接口提供了三个方法:

getObject( )
getObjectType( )
isSingleton( )
三个方法的意义非常明确——getObject( )希望返回改造后的bean对象到spring容器中,getObjectType( )希望返回改造的bean的具体类型,isSingleton( )希望返回改造的bean是否是单例的。

⼀般情况下,Spring通过反射机制利⽤ <bean> <bean> 的class属性指定实现类实例化Bean.
在某些情况下,实例化Bean过程⽐较复杂,如果按照传统的⽅式,则需要在 <bean> <bean> 中提供⼤量的配置信息。
配置⽅式的灵活性是受限的,这时采⽤编码的⽅式可能会得到⼀个简单的⽅案。

Spring为此提供了⼀个org.springframework.bean.factory.FactoryBean的⼯⼚类接⼝,⽤户可以通过实现该接⼝定制实例化Bean的逻辑.
FactoryBean接⼝对于Spring框架来说占⽤重要的地位,Spring⾃身就提供了70多个FactoryBean的实现。
它们隐藏了实例化⼀些复杂Bean的细节,给上层应⽤带来了便利。从Spring3.0开始,FactoryBean开始⽀持泛型,即接⼝声明改为 FactoryBean<T> 的形式

以Bean结尾,表示它是⼀个Bean,不同于普通Bean的是:它是实现了 FactoryBean<T> 接⼝的Bean,根据该Bean的ID从BeanFactory中获取的实际上是FactoryBean的getObject()返回的对象,⽽不是FactoryBean本身,如果要获取FactoryBean对象,请在id前⾯加⼀个&符号来获取。

例如⾃⼰实现⼀个FactoryBean,功能:⽤来代理⼀个对象,对该对象的所有⽅法做⼀个拦截,在调⽤前后都输出⼀⾏LOG,模仿ProxyFactoryBean的功能。

FactoryBean是⼀个接⼝,当在IOC容器中的Bean实现了FactoryBean后,通过getBean(StringBeanName)获取到的Bean对象并不是FactoryBean的实现类对象,⽽是这个实现类中的getObject()⽅法返回的对象。要想获取FactoryBean的实现类,就要getBean(&BeanName),在BeanName之前加上&。

public interface FactoryBean<T> {
 T getObject() throws Exception;
 Class<?> getObjectType();
 boolean isSingleton();
}
在该接⼝中还定义了以下3个⽅法:

 - TgetObject():返回由FactoryBean创建的Bean实例,如果isSingleton()返回true,则该实例会放到Spring容器中单实例缓存
 - booleanisSingleton():返回由FactoryBean创建的Bean实例的作⽤域是singleton还是prototype;
 - ClassgetObjectType():返回FactoryBean创建的Bean类型。
 - 
当配置⽂件中 <bean> 的class属性配置的实现类是FactoryBean时,通过getBean()⽅法返回的不是FactoryBean本身。
⽽是FactoryBean#getObject()⽅法所返回的对象,相当于FactoryBean#getObject()代理了getBean()⽅法。

3 总结

区别:BeanFactory是个Factory,也就是IOC容器或对象⼯⼚,FactoryBean是个Bean。在Spring中,
所有的Bean都是由BeanFactory(也就是IOC容器)来进⾏管理的。
FactoryBean是个Bean.在Spring中,所有的Bean都是由BeanFactory(也就是IOC容器)来进行管理的。但对FactoryBean而言,这个Bean不是简单的Bean,而是一个能生产或者修饰对象生成的工厂Bean,它的实现与设计模式中的工厂模式和修饰器模式类似 .

BeanFactory:是一个工厂接口,是spring最底层的接口,用于创建和管理普通的bean对象。

FactoryBean:是一个Bean接口,在Ioc容器的基础上给Bean的实现增加了一个工厂模式和装饰模式,返回的对象由getObject( )决定。相当于对普通的bean对象进行了改造。

总结:
BeanFactory是个Factory,也就是IOC容器或对象⼯⼚,FactoryBean是个Bean。
在Spring中,所有的Bean都是由BeanFactory(也就是IOC容器)来进⾏管理的。
但对FactoryBean⽽⾔,这个Bean不是简单的Bean,⽽是⼀个能⽣产或者修饰对象⽣成的⼯⼚Bean,它的实现与设计模式中的⼯⼚模式和修饰器模式类似

BeanFactory:
1)负责生产和管理Spring中bean的一个工厂;
2)IOC容器的核心接口,它的职责包括:实例化、定位、配置应用程序中的对象及建立这些对象的依赖。
3)多种实现:如 DefaultListableBeanFactory、XmlBeanFactory、ApplicationContext等,其中XmlBeanFactory就是常用的一个,该实现将以XML方式描述组成应用的对象及对象间的依赖关系。

在这里插入图片描述
FactoryBean

FactoryBean是一个接口,当在IOC容器中的Bean实现了FactoryBean后,通过getBean(String BeanName)获取到的Bean对象并不是FactoryBean的实现类对象,而是这个实现类中的getObject()方法返回的对象。要想获取FactoryBean的实现类,就要getBean(&BeanName),在BeanName之前加上&。

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值