一、前言
ObjectFactory
表示一个对象工厂,这提供 T getObject()
返回工厂产生的对象。Spring DOC 有如下描述
定义一个可以返回对象实例的工厂,该对象实例可以是共享或独立的。 该接口封装一个通用的工厂接口,每次调用时都会返回一个新的实例对象(prototype)。 这个接口与 FactoryBean 类似,但后者的实现通常被定义为 BeanFactory 中的 SPI 实例,而这个类的实现通常作为 API 提供给其他 bean (通过注入)。
二、接口定义
@FunctionalInterface
public 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#doCreateBean
if (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#getEarlyBeanReference
protected 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 创建单例Bean
return 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
仅仅是一个普通的对象工厂,提供函数式接口编程。仅此而已。