这个方法的入参里有一个匿名类的返回值。
我们先看这个方法的代码:
类 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 本身,而可能是经过某种处理的。
版权声明:本文为weixin_44367006原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。