BeanFactory和FactoryBean区别
作者:bin先上图,看下图中beanFactory和FactoryBean各在哪

实际上都是2各接口,一个提供了bean的管理能力,另一个提供了bean自定义的创建模式。
AbstractBeanFactory这个抽象类同时实现了这两个接口。
FactoryBean接口的源码
public interface FactoryBean {
//获取对象实例的方法
T getObject() throws Exception;
//获取对象类型
Class<?> getObjectType();
//对象是否是单例模式
boolean isSingleton();
}
spring在加载FactoryBean时的源码,我们查看AbstractBeanFactory的getObjectForBeanInstance()方法:
protected Object getObjectForBeanInstance(
Object beanInstance, String name, String beanName, @Nullable RootBeanDefinition mbd) {
...
//如果不是FactoryBean,或者是要找FactoryBean的原bean(即实现FactoryBean接口的那个bean),就直接返回
if (!(beanInstance instanceof FactoryBean) || BeanFactoryUtils.isFactoryDereference(name)) {
return beanInstance;
}
Object object = null;
if (mbd == null) {
//从缓存中找
object = getCachedObjectForFactoryBean(beanName);
}
if (object == null) {
...
//获取bean实体
object = getObjectFromFactoryBean(factory, beanName, !synthetic);
}
return object;
}
我们查看getObjectFromFactoryBean的源码:
protected Object getObjectFromFactoryBean(FactoryBean<?> factory, String beanName, boolean shouldPostProcess) {
if (factory.isSingleton() && containsSingleton(beanName)) {
synchronized (getSingletonMutex()) {
//从缓存取
Object object = this.factoryBeanObjectCache.get(beanName);
if (object == null) {
//从FactoryBean中取
object = doGetObjectFromFactoryBean(factory, beanName);
...
}
}
...
}
我们继续深入doGetObjectFromFactoryBean方法,可以清楚的看到,调用FactoryBean的接口,获取bean实体:
private Object doGetObjectFromFactoryBean(final FactoryBean<?> factory, final String beanName)
throws BeanCreationException {
Object object;
try {
if (System.getSecurityManager() != null) {
...
}
else {
//调用FactoryBean的接口,获取bean实体
object = factory.getObject();
}
}
...
return object;
}