一、前言
ObjectFactory 表示一个对象工厂,这提供 T getObject() 返回工厂产生的对象。Spring DOC 有如下描述
定义一个可以返回对象实例的工厂,该对象实例可以是共享或独立的。 该接口封装一个通用的工厂接口,每次调用时都会返回一个新的实例对象(prototype)。 这个接口与 FactoryBean 类似,但后者的实现通常被定义为 BeanFactory 中的 SPI 实例,而这个类的实现通常作为 API 提供给其他 bean (通过注入)。
二、接口定义
@FunctionalInterfacepublic interface ObjectFactory<T> {/*** Return an instance (possibly shared or independent)* of the object managed by this factory.* @return the resulting instance* @throws BeansException in case of creation errors*/T getObject() throws BeansException;}
接口定义非常简单,他拥有如下实现: 
只关注 spring-beans 包下的实现,也就是前三个,都是通过 lambda表达式实现接口。这三个都非常之重要。
2.1 提早暴露工厂方法以解决循环引用
相关核心代码如下:
// org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#doCreateBeanif (earlySingletonExposure) {// 3-2 添加单例工厂(名称-> ObjectFactory,可以通过getObject()获取对象实例,主要生成用于AOP代理)addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean));}protected void addSingletonFactory(String beanName, ObjectFactory<?> singletonFactory) {Assert.notNull(singletonFactory, "Singleton factory must not be null");synchronized (this.singletonObjects) {if (!this.singletonObjects.containsKey(beanName)) {this.singletonFactories.put(beanName, singletonFactory);this.earlySingletonObjects.remove(beanName);this.registeredSingletons.add(beanName);}}}// org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#getEarlyBeanReferenceprotected Object getEarlyBeanReference(String beanName, RootBeanDefinition mbd, Object bean) {Object exposedObject = bean;// Spring内置只有一个实现类,即AnnotationAwareAspectJAutoProxyCreator(通过注解@EnableAspectJAutoProxy开启)// 创建代理对象if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {for (SmartInstantiationAwareBeanPostProcessor bp : getBeanPostProcessorCache().smartInstantiationAware) {exposedObject = bp.getEarlyBeanReference(exposedObject, beanName);}}return exposedObject;}
关于循环引用,请戳这里。简单说明一下,提早暴露工厂主要与 AOP 代理有关。
2.2 实例化单例
// org.springframework.beans.factory.support.AbstractBeanFactory#doGetBean// #5 通过BeanDefinition真正实例化Bean对象if (mbd.isSingleton()) {sharedInstance = getSingleton(beanName, () -> {try {// 5-1 创建单例Beanreturn createBean(beanName, mbd, args);}catch (BeansException ex) {// Explicitly remove instance from singleton cache: It might have been put there// eagerly by the creation process, to allow for circular reference resolution.// Also remove any beans that received a temporary reference to the bean.destroySingleton(beanName);throw ex;}});bean = getObjectForBeanInstance(sharedInstance, name, beanName, mbd);}
通过 createBean 根据 BeanDefinition 实例化单例对象。在这里完成反射创建对象、应用相关后置处理器、Spring生命周期回调等流程后,最终返回一个完整的单例对象。
2.3 其他作用域对象
// org.springframework.beans.factory.support.AbstractBeanFactory#Object scopedInstance = scope.get(beanName, () -> {beforePrototypeCreation(beanName);try {return createBean(beanName, mbd, args);}finally {afterPrototypeCreation(beanName);}});
三、总结
ObjectFactory 仅仅是一个普通的对象工厂,提供函数式接口编程。仅此而已。
