Spring中的FactoryBean与BeanFactory有什么区别

在Spring中有两个容易混淆的接口BeanFatcory和FactoryBean,面试的时候也经常会问到两者的区别,这里简单做一下介绍。

Spring中的FactoryBean与BeanFactory有什么区别

Spring

简单来说,BeanFatcory是Spring中的IOC容器的核心,它是负责产生和管理Bean的工厂,在BeanFatcory接口中定义了一系列接口方法,这些方法定义了实例化、定位、配置应用程序中的对象及建立这些对象间的依赖等功能,当然在BeanFatcory中并没有方法的具体实现,具体的实现在BeanFatcory相关实现类中。

FactoryBean也是一个Bean,且会被BeanFatcory及其实现类管理。但是这个Bean不同的地方在于用户可以实现这个接口来自定义Bean实例化的逻辑。这个接口是一个泛型接口,通过getBean()获取到Bean不是FactoryBean本身,而是泛型参数,也就是接口中getObject()方法返回的对象。如果要返回FactoryBean的实现类本身,则需要加一个特殊符号“&”。

BeanFactory

前面说BeanFatcory是IOC容器的核心,是Spring中的一个基础接口,有很多的实现类。以Springboot为例,在应用启动时,加载Bean的工作就是由BeanFatcory的实现类来实现的,当然,SpringMvc中加载Bean的工作也是由BeanFatcory的实现类来实现的,只是具体类不一样而已。参考下图:

Spring中的FactoryBean与BeanFactory有什么区别

AnnotationConfigServletWebServerApplicationContext类图

在Springboot中加载Bean的工作的具体实现类是AnnotationConfigServletWebServerApplicationContext。这个类的层级很深,但是确实是间接实现类BeanFatcory接口。

这里就不详细分析源码AnnotationConfigServletWebServerApplicationContext的实现,感兴趣的同学可以自己研究下,我们可以简单看下BeanFatcory接口定义哪些方法。

Spring中的FactoryBean与BeanFactory有什么区别

BeanFactory接口

方法主要分几类:

getBean()方法很简单,顾名思义就是获取Bean。

getBeanProvider()是5.1版本提供的新方法,主要是返回指定Bean的提供者,供懒加载的时候初始化Bean。

containsBean()用来判断这个factory是否包含指定名称的Bean定义。

isSingleton这个Bean是否单例。

isPrototype 这个Bean是否多例。

isTypeMatch()检查指定的Bean是否和给定的类型匹配。

getType()返回指定的Bean的类型。

getAliases()获取指定的Bean的别名。

FactoryBean

FactoryBean既是个Bean也是个产生Bean的工厂。通过getBean()方法获取Bean时,如果这个Bean实现了FactoryBean接口,那么返回的Bean不是这个Bean本身,而是FactoryBean的getObject()方法返回的类型,如果要返回FactoryBean的实现类本身,则需要加一个特殊符号“&”。FactoryBean有很多实现类,例如常见的线程池类ThreadPoolExecutorFactoryBean,yaml属性配置类YamlPropertiesFactoryBean等。可以看下有哪些实现类,包括但是不限于以下这些:

Spring中的FactoryBean与BeanFactory有什么区别

FactoryBean实现类

看下FactoryBean的接口定义:

Spring中的FactoryBean与BeanFactory有什么区别

FactoryBean接口

这个接口是一个泛型接口,简单来说,泛型接口是指类型在定义时候是不确定的,只有当实现接口甚至是在实例化对象时才会确定。主要有以下几个方法:

getObject()是这个接口的核心方法,当调用容器getBean()方法获取Bean时,如果这Bean对应的类是FactoryBean接口的实现类,那么就返回这个方法的返回值。也就是说这个方法的返回对象是真正的返回的Bean,主要适用于实例化比较复杂的Bean。

其余两个方法比较简单,顾名思义就知道其作用。

上面说了这么多,总结一下可以用下面一张图表示:

Spring中的FactoryBean与BeanFactory有什么区别

BeanFactory与FactoryBean关系

BeanFatcory是管理所有Bean的生命周期,FactoryBean也是一种Bean,由BeanFatcory管理。当调用容器getBean()方法时,如果指定的Bean的实现类实现了FactoryBean这个接口,那么就返回getObject()方法里面返回的另外一个Bean。


分享到:


相關文章: