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 系列的文章就算结束了,接下来的一个星期我会想好更新那个系列的文章,然后开始新的篇章!!!!
评论