第一节介绍Spring启动(链接)时,介绍AbstractApplicationContext的过销毁过程,主要是调用了内部的destroyBeans方法,这节便来介绍bean的销毁过程。

一.销毁流程

destroyBeans方法内部委托给了DefaultSingletonBeanRegistry的destroySingletons方法。destroySingletons方法如下,比较清晰:

 前面介绍过,DefaultSingletonBeanRegistry用一个Map缓存着所有的单例实例,对于对象的销毁,只要简单的将其从Map中移除就行。主要处理的是依赖关系下的bean销毁顺序以及回调接口的处理。上面先对disposableBeans中所涉及到的bean逐个进行销毁,然后再清理所有的依赖关系和缓存的单例实例。

 上一节提到,disposableBeans中存放的是存在销毁时需要进行方法回调的DisposableBeanAdapter对象,key为对应的bean name,会在bean初始化后进行判断并且存入。这里会优先处理这些bean的销毁,下面重点介绍下destroySingleton方法。

二.destroySingleton

 如上描述了该方法的大致过程,分别为

  1. 将DefaultSingletonBeanRegistry中缓存的各种单例实例清除掉

  2. 执行disposableBeans.remove方法,移除该beanName,这里会返回一个DisposableBean对象

  3. 删除dependentBeanMap中beanName的内容,也是执行remove的方法,会返回依赖于beanName的其他bean name列表,再依次调用destorySingleton销毁这些bean

  4. 对当前的DisposableBean执行destory

  5. 删除containedBeanMap中beanName的内容,执行的remove方法,hi返回beanName依赖的其他bean name列表,再依次调用destorySingleton销毁这些bean
    从而具体的回调发生在第4步,开头提到,bean在实例化后会以DisposableBeanAdapter存放进disposableBeans中,从而该类实现了具体的回调过程。

三.DisposableBeanAdapter

 DisposableBeanAdapter的结构如下,其实现了DisposableBean接口,因而可以如上面说的,在destroySingleton方法进行回调。它在构造方法中对几个重要的属性进行了赋值,用于存储销毁动作相关的信息,包括:

  1. Bean:待销毁bean对象

  2. beanName:待销毁bean的beanName

  3. destroyMethodName:待销毁要调用的方法,该方法来源于destory-method配置项,如果为(inferred),则会将回调方法赋值为close或者shutdown

  4. destoryMethod:destoryMethodName对应的Method对象

  5. beanPostProcessors:需要处理该bean的DestructionAwareBeanPostProcessor回调列表。在实例化DisposableBeanAdapter对象时,会过滤系统中的BeanPostProcessor列表,找出实现DestructionAwareBeanPostProcessor接口,且requiresDestruction方法返回true的实例,用于后续进行回调。(InitDestroyAnnotationBeanPostProcessor类实现了该方法,用以回调@PreDestory注解的方法,CommonAnnotationBeanPostProcessor继承自该类,设置了destroyAnnotationType为PreDestroy.class)

 当按照第(二)部分第4步执行时,该类会按照如下顺序执行销毁动作:

  1. 如果beanPostProcessors列表不为空,则回调DestructionAwareBeanPostProcessor的postProcessBeforeDestruction方法,即执行@PreDestory注解方法

  2. 如果实现了DisposableBean,则回调DisposableBean的destroy方法,即执行DisposableBean接口方法

  3. 如果配置了destroy-method,则执行配置的方法,即执行destory-method配置方法

个人公众号:啊驼

本文由博客一文多发平台 OpenWrite 发布!

Spring DestorySingleton流程的更多相关文章

  1. Spring(六)Spring执行流程

    Spring MVC工作流程图 Spring工作流程描述 1. 用户向服务器发送请求,请求被Spring 前端控制Servelt DispatcherServlet捕获: 2. DispatcherS ...

  2. Java框架之SpringMVC 05-拦截器-异常映射-Spring工作流程

    SpringMVC 拦截器 Spring MVC也可以使用拦截器对请求进行拦截处理,可以自定义拦截器来实现特定的功能,自定义的拦截器可以实现HandlerInterceptor接口中的三个方法,也可以 ...

  3. spring 启动流程

    AbstractApplicationContext 分析 启动流程 // Prepare this context for refreshing.prepareRefresh(); 1. // In ...

  4. Spring MVC流程

    这是spring mvc框架结构图,图片是很早在网上撸过来的,具体在哪忘了…… 早期学习Springmvc 并没有具体了解过,只知道这样用很爽,最近了解下基本结构流程及组件所在…… 执行流程 Spri ...

  5. shiro集成spring&工作流程&DelegatingFilterProxy

    1.集成Spring 参考文献: 新建web工程: ehcache-core来自Hibernate wen.xml <?xml version="1.0" encoding= ...

  6. 概括的描述一下Spring注册流程

    Spring经过大神们的构思.编码,日积月累而来,所以,对其代码的理解也不是一朝一夕就能快速完成的.源码学习是枯燥的,需要坚持!坚持!坚持!当然也需要技巧,第一遍学习的时候,不用关注全部细节,不重要的 ...

  7. Spring管理流程部署——Activiti

    pom.xml <!-- activit jar 包 --> <dependency> <groupId>org.activiti</groupId> ...

  8. Spring GetBean流程

     第一节讲解Spring启动的时候说到,Spring内部先解析了所有的配置,加载所有的Bean定义后,再根据需要对Bean进行实例化和初始化.除开Spring自己主动新建的对象,第一次根据Bean定义 ...

  9. 【面试】Spring 执行流程

    Spring Aop的实现原理: AOP 的全称是  Aspect Orient Programming  ,即面向切面编程.是对 OOP (Object Orient Programming) 的一 ...

随机推荐

  1. hdu6373 Pinball 杭电第六场 物理知识

    Pinball Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total S ...

  2. Windows下安装youtube-dl(下载各大网站视频)

    youtube-dl干什么用的? 惯例,看官方介绍: youtube-dl is a command-line program to download videos from YouTube.com ...

  3. JS数据结构第六篇 --- 二叉树力扣练习题

    1.第226题:翻转二叉树 递归+迭代两种实现方式: /** 反转二叉树 * Definition for a binary tree node. * function TreeNode(val) { ...

  4. 【LeetCode】56-合并区间

    题目描述 给出一个区间的集合,请合并所有重叠的区间. 示例 1: 输入: [[1,3],[2,6],[8,10],[15,18]] 输出: [[1,6],[8,10],[15,18]] 解释: 区间 ...

  5. Could not delete D:/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp1/wtpwebapps/platform/WEB-INF/lib

    再把之前的maven工程删掉时,出现了如下错误: Could not delete D:/workspace/.metadata/.plugins/org.eclipse.wst.server.cor ...

  6. jps虚拟机进程状态工具

    jps(JVM Process Status Tool) jps工具可以列出正在运行的虚拟机进程,并显示虚拟机执行主类名称以及这些进程的本地虚拟机唯一ID(Local Virtual Machine ...

  7. 【第十七篇】easyui-datagrid 导出Excel (在客户端能弹出下载框)

    //导出Excel function exportExcel(obj) { var SaleOrderNo = $("#SaleOrderNo").val().trim(); va ...

  8. Flink入门宝典(详细截图版)

    本文基于java构建Flink1.9版本入门程序,需要Maven 3.0.4 和 Java 8 以上版本.需要安装Netcat进行简单调试. 这里简述安装过程,并使用IDEA进行开发一个简单流处理程序 ...

  9. Yum未完成事务问题

    1.安装 yum-complete-transaction [root@linux-node1 ~]# yum -y install yum-utils 2.清除yum缓存 [root@linux-n ...

  10. Winform中实现ZedGraph新增自定义Y轴上下限、颜色、标题功能

    场景 Winform中实现ZedGraph的多条Y轴(附源码下载): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/1001322 ...