接下去说,上一次最后一个函数里面有三个函数调用,即
destroyBeans(); createBeanFactory() ; loadBeanDefinitions(beanFactory);
1.2.2.1.1 destroyBeans() : 清除当前上下文的所有 bean ,默认的实现为:清除当前上下文的所有缓存的单例 bean ,默认的实现在父类: AbstractApplicationContext ,代码为:
getBeanFactory (). destroySingletons ();
其中: getBeanFactory () 在子类 AbstractRefreshableApplicationContext 中实现,返回该类的一个
DefaultListableBeanFactory 类型的 字段 beanFactory ;
其中: destroySingletons () 定义在接口 ConfigurableBeanFactory 中,由类图发现 DefaultListableBeanFactory 实现了 ConfigurableBeanFactory 接口,该方法在其父类: DefaultSingletonBeanRegistry 里有实现。定义如下:
====================================================================
public void destroySingletons() {
if ( logger .isInfoEnabled()) {
logger .info( "Destroying singletons in " + this );
}
/** singletonObjects 为一个 MAP 对象,缓存当前的单体实例。 */
synchronized ( this . singletonObjects ) {
/**
* singletonsCurrentlyInDestruction : 我们目前是否在 destroySingletons 。
*/
this . singletonsCurrentlyInDestruction = true ;
}
/**
* disposableBeans 为一个 MAP 对象,缓存当前的一次性 bean 。
*/
synchronized ( this . disposableBeans ) {
String[] 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();
synchronized ( this . singletonObjects ) {
this . singletonObjects .clear();
this . singletonFactories .clear();
this . earlySingletonObjects .clear();
this . registeredSingletons .clear();
this . singletonsCurrentlyInDestruction = false ;
}
}
====================================================================
1.2.2.1.1.1 destroySingleton(disposableBeanNames[i]) : 如果给定的 bean 存在则,销毁给定的 bean ,定义如下:
====================================================================
public void destroySingleton(String beanName) {
// 根据给定的名字删除给定 bean
// 销毁相应的一次性 bean 实例
DisposableBean disposableBean = null ;
synchronized ( this . disposableBeans ) {
disposableBean = (DisposableBean) this . disposableBeans .remove(beanName);
destroyBean(beanName, disposableBean);
}
====================================================================
1.2.2.1.1.1.1 protected void removeSingleton(String beanName) :从当前的 factory 中删除给定名字的 bean 。定义如下:
singletonObjects— 缓存单例 bean 的 map
singletonFactories— 缓存单例工厂 bean 的 map
earlySingletonObjects— 缓存早期的单例 bean 的 map
registeredSingletons— 注册的单例 bean 名字的集合,按照注册的顺序存放的 Set
====================================================================
protected void removeSingleton(String beanName) {
synchronized ( this . singletonObjects ) {
this . singletonObjects .remove(beanName);
this . singletonFactories .remove(beanName);
this . earlySingletonObjects .remove(beanName);
this . registeredSingletons .remove(beanName);
}
}
====================================================================
1.2.2.1.1.1.2 destroyBean (beanName, disposableBean); 先销毁依赖于给定 bean 的 bean ,再销毁给定的 bean 。代码如下:
====================================================================
protected void destroyBean(String beanName, DisposableBean bean) {
// 首先销毁依赖 bean
// dependentBeanMap—bean 的 name 和依赖于该 bean 的 bean 的 name 的集合的 map
Set dependencies = (Set ) this . dependentBeanMap .remove(beanName);
if (dependencies != null ) {
if ( logger .isDebugEnabled()) {
logger .debug( "Retrieved dependent beans for bean '" + beanName + "': " + dependencies);
}
for (Iterator it = dependencies.iterator(); it.hasNext();) {
String dependentBeanName = (String) it.next();
// 递归调用
destroySingleton(dependentBeanName);
}
}
// 真正开始销毁 bean
if (bean != null ) {
try {
bean.destroy();
}
catch (Throwable ex) {
logger .error( "Destroy method on bean with name '" + beanName + "' threw an exception" , ex);
}
}
// 触发销毁包含的 bean
// containedBeanMap—bean 的 name 和该 bean 所包含的 bean 的 name 的集合的 map
Set containedBeans = (Set ) this . containedBeanMap .remove(beanName);
if (containedBeans != null ) {
for (Iterator it = containedBeans.iterator(); it.hasNext();) {
String containedBeanName = (String) it.next();
/ 递归调用
destroySingleton(containedBeanName);
}
}
// Remove destroyed bean from other beans' dependencies.
synchronized ( this . dependentBeanMap ) {
for (Iterator it = this . dependentBeanMap .entrySet().iterator(); it.hasNext();) {
Map.Entry entry = (Map.Entry ) it.next();
Set dependenciesToClean = (Set ) entry.getValue();
dependenciesToClean.remove(beanName);
if (dependenciesToClean.isEmpty()) {
it.remove();
}
}
}
// Remove destroyed bean's prepared dependency information.
// dependenciesForBeanMap—bean 的 name 和该 bean 的依赖关系的 bean 的 name 集合的 map
this . dependenciesForBeanMap .remove(beanName);
}
====================================================================
本站支持 pay for your wishes
相关推荐
3、源码分析-IOC容器的初始化 4、源码分析-IOC容器的依赖注入 5、源码分析-IOC容器的高级特性 三阶段 Spring AOP的涉及原理及具体实践 SpringJDBC的涉及原理及二次开发 SpringMVC框架设计原理及手写实现 四阶段 ...
本文深入探讨了Spring框架中IoC容器的源码机制,涵盖了容器的初始化、Bean工厂的实例化、Bean定义的读取及Spring Bean的生命周期管理。通过精细的分析,本文揭示了AnnotationConfigApplicationContext的实例化过程,...
为Spring提供了基础的Web功能支持,主要建立于核心容器之上,通过Servlet或者Listeners来初始化IOC容器; spring-webmvc: 主要提供对SpringMVC的支持,例如SpringMVC中的DispatcherServlet就是该模块中提供的; ...
本文深入探讨了Spring IoC容器的加载过程及其源码实现,揭示了Spring中最为根本的概念之一。这包括从AnnotationConfigApplicationContext的实例化开始,到DefaultListableBeanFactory工厂的建立,再到...
1、通过分析 Spring 源码,深刻掌握核心原理和设计思想 2、通过本课的学习,完全掌握 SpringIOC 容器的初始化细节,并手绘时序图 3、掌握看源码不
简单的说,在web容器中,通过ServletContext为Spring的IOC容器提供宿主环境,对应的建立起一个IOC容器的体系。其中,首先需要建立的是根上下文,这个上下文持有的对象可以有业务对象,数据存取对象,资源,事物管理...
整个视频课程将由浅入深,介绍spring5源码的构建、spring5IOC容器的初始化过程、bean的声明周期过程、spring BeanFactoryPostporcessor并且结合原理给出当前流行的应用框架如何利用spring的源码知识写出优雅的代码,...
包括内容:Spring体系结构、Spring重要接口讲解(BeanFactory继承体系、BeanDefinition继承体系、ApplicationContext继承体系)、IOC/DI(容器初始化流源码分析)、AOP原理(解析流程,代理流程,执行流程)、事务...
java进阶源码分析专题常用设计模式线程与并发锁的使用深度理解synchronized、volatile、cas手写ASQSpring5IOC容器设计原理及高级特性AOP设计原理FactoryBean与BeanFactorySpring事务处理机制Spring JDK动态代理...
8.4.3 改变初始化和销毁方式 8.4.4 改变异常处理的方式 8.5 小结 第九章 CVS使用指南 9.1 CVS介绍 9.1.1 CVS简介 9.1.2 为什么要使用CVS 9.2 建立CVS的开发环境 9.2.1 下载CVS 9.2.2 配置CVS 9.3 CVS的使用方法 ...
8.4.3 改变初始化和销毁方式 8.4.4 改变异常处理的方式 8.5 小结 第九章 CVS使用指南 9.1 CVS介绍 9.1.1 CVS简介 9.1.2 为什么要使用CVS 9.2 建立CVS的开发环境 9.2.1 下载CVS 9.2.2 配置CVS 9.3 CVS的使用方法 ...
8.4.3 改变初始化和销毁方式 8.4.4 改变异常处理的方式 8.5 小结 第九章 CVS使用指南 9.1 CVS介绍 9.1.1 CVS简介 9.1.2 为什么要使用CVS 9.2 建立CVS的开发环境 9.2.1 下载CVS 9.2.2 配置CVS 9.3 CVS的使用方法 ...
8.4.3 改变初始化和销毁方式 8.4.4 改变异常处理的方式 8.5 小结 第九章 CVS使用指南 9.1 CVS介绍 9.1.1 CVS简介 9.1.2 为什么要使用CVS 9.2 建立CVS的开发环境 9.2.1 下载CVS 9.2.2 配置CVS 9.3 CVS的使用方法 ...