跳到主要内容

吃透Spring源码(八):Spring中FactoryBean真相揭秘

一,FactoryBean和BeanFactory

  • FactoryBean:首先它是一个Bean,但又不仅仅是一个Bean。它是一个能生产或修饰对象生成的工厂Bean,类似于设计模式中的工厂模式和装饰器模式。它能在需要的时候生产一个对象,且不仅仅限于它自身,它能返回任何Bean的实例。
  • BeanFactory:是Spring中Bean工厂的顶层接口,也是我们常说的SpringIOC容器,它定下了IOC容器的一些规范和常用方法并管理着Spring中所有的Bean。

二,FactoryBean揭秘

定义一个FactoryBean用于生产A对象:

public class MyFactoryBean implements FactoryBean<A> {


@Override
public A getObject() throws Exception {


return new A();
}

@Override
public Class<?> getObjectType() {


return A.class;
}
}

在xml中把定义的MyFactoryBean注入进去:

<bean id="myFactoryBean" class="com.bobo.MyFactoryBean"></bean>

1,解析为beanDefinition

通过debug调试,当源码走完obtainFreshBeanFactory()方法后,MyFactoryBean已经解析为BeanDefinition并且放入到BeanDefinitionMap中:

 

2,实例化对象

继续调试,当我们走完finishBeanFactoryInitialization(beanFactory);方法时可以看到MyFactoryBean已经被实例化并且缓存到了singletonObjects中: