前言
在Spring中有两个接口:BeanFactory和FactoryBean,乍一看,这哥俩是一个东西吗?好容易混淆啊。
目录
BeanFactory
BeanFactory是什么?
BeanFactory是Spring中所有Bean容器的顶级接口,负责对Bean的创建、访问等工作
BeanFactory的结构
BeanFactory定义了getBean()、containsBean()等管理Bean的通用方法
DefaultListableBeanFactory、XmlBeanFactory、ApplicationContext这几个Spring的容器都是它的具体实现
常见的使用场景
1、从IOC容器中获取Bean
如context.getBean("aqiu")或context.getBean("aqiu",Bro.Class)
根据bean的名称,获取指定的bean实例。两个参数的方法中第二个方法是增加了一个类型的检验。
2、判断Bean是否为单例: context.isSingleton("aqiu")
3、检索IOC容器中是否包含指定的Bean: context.containsBean("aqiu")
FactoryBean
FactoryBean是什么?
FactoryBean是一个可生产Bean的工厂Bean,动态生成某一个类型的Bean的实例。
FactoryBean的结构
public interface FactoryBean<T> { /** * 从工厂中获取bean实例 */ T getObject() throws Exception; /** * 从工厂中获取bean实例对象的类型 */ Class<?> getObjectType(); /** * 工厂创建的对象是否是单例 */ boolean isSingleton(); }
如果一个Bean实现了FactoryBean接口,那么这个Bean就变成了一个工厂,根据Bean的名称获取到的实际上是工厂调用getObject()返回的对象,而不是Bean本身,如果要获取工厂Bean自身的实例,那么需要在名称前面加上'&'符号。
getObject('name')返回工厂中的实例
getObject('&name')返回工厂本身的实例
FactoryBean使用场景
在Spring中最为典型的一个应用场景就是用来创建AOP的代理对象。
AOP代理对象通过Java的反射机制,在运行时创建了一个代理对象,在代理对象的目标方法中根据业务要求织入了相应的方法。这个对象在Spring中就是——ProxyFactoryBean。
二者的区别是什么?
BeanFactory是个Factory,是IOC容器。而FactoryBean就是个Bean,还是归BeanFactory管理。在Spring中,所有的Bean都是由BeanFactory(也就是IOC容器)来进行管理的。而FactoryBean这个Bean也不是简单的Bean,而是一个能生产或者修饰对象生成的工厂Bean,它的实现与设计模式中的工厂模式和修饰器模式类似。