这个方法的入参里有一个匿名类的返回值。
我们先看这个方法的代码:
类 DefaultSingletonBeanRegistry
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);
}
}
}
可以看到三级缓存里,key 是 beanName,value 就是这个匿名类的返回值,对象工厂 singletonFactory。
而 singletonFactory.getObject() 的返回值就是是 getEarlyBeanReference 的返回值
跟 getEarlyBeanReference:
protected Object getEarlyBeanReference(String beanName, RootBeanDefinition mbd, Object bean) {
Object exposedObject = bean;
if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
for (BeanPostProcessor bp : getBeanPostProcessors()) {
if (bp instanceof SmartInstantiationAwareBeanPostProcessor) {
SmartInstantiationAwareBeanPostProcessor ibp = (SmartInstantiationAwareBeanPostProcessor) bp;
//拿到经过处理的 Bean
exposedObject = ibp.getEarlyBeanReference(exposedObject, beanName);
}
}
}
return exposedObject;
}
跟 getEarlyBeanReference:

循环到 InstantiationAwareBeanPostProcessorAdapter

返回的就是一个 bean,这个 BeanPostProcessor 在这里并不做处理。
而如果是 AbstractAutoProxyCreator
@Override
public Object getEarlyBeanReference(Object bean, String beanName) {
Object cacheKey = getCacheKey(bean.getClass(), beanName);
if (!this.earlyProxyReferences.contains(cacheKey)) {
this.earlyProxyReferences.add(cacheKey);
}
//返回代理对象,假如能生成代理的话,见3
return wrapIfNecessary(bean, beanName, cacheKey);
}
这就体现了三级缓存要搞一个 ObjectFactory 的意义了,因为有的时候我们要的不是这个 bean 本身,而可能是经过某种处理的。
Spring三级缓存解析
本文深入探讨了Spring框架中DefaultSingletonBeanRegistry类的addSingletonFactory方法,解释了如何使用三级缓存来存储bean实例的工厂,以及在某些情况下,如何通过ObjectFactory返回经过特定处理的bean,而非直接的bean实例。
318





