JAVA-面试官常问-BeanFactory和FactoryBean的区别

前言

在Spring中有两个接口:BeanFactory和FactoryBean,乍一看,这哥俩是一个东西吗?好容易混淆啊。

目录

 

BeanFactory

BeanFactory是什么?

BeanFactory的结构

常见的使用场景

FactoryBean

FactoryBean是什么?

FactoryBean的结构

 FactoryBean使用场景

二者的区别是什么?


 

BeanFactory

BeanFactory是什么?

BeanFactory是Spring中所有Bean容器的顶级接口,负责对Bean的创建、访问等工作

BeanFactory的结构

JAVA-面试官常问-BeanFactory和FactoryBean的区别_第1张图片

 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的结构

JAVA-面试官常问-BeanFactory和FactoryBean的区别_第2张图片

public interface FactoryBean {

  /**
   * 从工厂中获取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,它的实现与设计模式中的工厂模式和修饰器模式类似。

你可能感兴趣的:(#,Spring,#,java相关,java,spring,开发语言)