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);
}
//指示我们当前是否在 destroySingletons 中的标志
synchronized (this.singletonObjects) {
this.singletonsCurrentlyInDestruction = true;
}
String[] disposableBeanNames;
synchronized (this.disposableBeans) {
//获取实现了DisposableBean接口的bean
disposableBeanNames = StringUtils.toStringArray(this.disposableBeans.keySet());
}
for (int i = disposableBeanNames.length - 1; i >= 0; i--) {
//销毁给定的bean。如果找到相应的一次性 bean 实例,则委托destroyBean
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 系列的文章就算结束了,接下来的一个星期我会想好更新那个系列的文章,然后开始新的篇章!!!!
评论