refresh中的destroyBeans、cancelRefresh方法
没错,我又更新spring系列的文章了,IOC系列文章到这篇文章就结束了。接下来会开始新的系列,有可能是多个系列同时更新,希望大家可以关注之后博主的动态。
destroyBeans
用于销毁此上下文管理的所有 bean 的模板方法。默认实现在此上下文中销毁所有缓存的单例,调用DisposableBean.destroy()和/或指定的“destroy-method”。 可以重写以在标准单例销毁之前或之后添加特定于上下文的 bean 销毁步骤,而上下文的 BeanFactory 仍然处于活动状态。
这个方法最终调用的是DefaultLisableBeanFactory#destroySingletons方法
代码:
public void destroySingletons() {
super.destroySingletons();
this.manualSingletonNames.clear();
clearByTypeCache();
}
分部分讲解:
destroySingletons
public void destroySingletons() {
if (logger.isDebugEnabled()) {
logger.debug("Destroying singletons in " + this);
}
synchronized (this.singletonObjects) {
this.singletonsCurrentlyInDestruction = true;
}
String[] disposableBeanNames;
synchronized (this.disposableBeans) {
disposableBeanNames = StringUtils.toStringArray(this.disposableBeans.keySet());
}
for (int i = disposableBeanNames.length - 1; i >= 0; i--) {
destroySingleton(disposableBeanNames[i]);
}
this.containedBeanMap.clear();
this.dependentBeanMap.clear();
this.dependenciesForBeanMap.clear();
clearSingletonCache();
}
this#manualSingletonNames#clear
清除手动注册单例的名称列表(按注册顺序)
clearByTypeCache
删除关于按类型映射的任何假设
cancelRefresh
取消此上下文的刷新尝试,在引发异常后重置active标志
protected void cancelRefresh(BeansException ex) {
this.active.set(false);
}
resetCommonCaches
重置 Spring 的公共核心缓存
protected void resetCommonCaches() {
ReflectionUtils.clearCache();
ResolvableType.clearCache();
CachedIntrospectionResults.clearClassLoader(getClassLoader());
}
好了,到这,SpringIOC系列的文章就算结束了,接下来的一个星期我会想好更新那个系列的文章,然后开始新的篇章!!!!
|