Spring DestorySingleton流程
第一节介绍Spring启动(链接)时,介绍AbstractApplicationContext的过销毁过程,主要是调用了内部的destroyBeans方法,这节便来介绍bean的销毁过程。
一.销毁流程
destroyBeans方法内部委托给了DefaultSingletonBeanRegistry的destroySingletons方法。destroySingletons方法如下,比较清晰:
前面介绍过,DefaultSingletonBeanRegistry用一个Map缓存着所有的单例实例,对于对象的销毁,只要简单的将其从Map中移除就行。主要处理的是依赖关系下的bean销毁顺序以及回调接口的处理。上面先对disposableBeans中所涉及到的bean逐个进行销毁,然后再清理所有的依赖关系和缓存的单例实例。
上一节提到,disposableBeans中存放的是存在销毁时需要进行方法回调的DisposableBeanAdapter对象,key为对应的bean name,会在bean初始化后进行判断并且存入。这里会优先处理这些bean的销毁,下面重点介绍下destroySingleton方法。
二.destroySingleton
如上描述了该方法的大致过程,分别为
将DefaultSingletonBeanRegistry中缓存的各种单例实例清除掉
执行disposableBeans.remove方法,移除该beanName,这里会返回一个DisposableBean对象
删除dependentBeanMap中beanName的内容,也是执行remove的方法,会返回依赖于beanName的其他bean name列表,再依次调用destorySingleton销毁这些bean
对当前的DisposableBean执行destory
删除containedBeanMap中beanName的内容,执行的remove方法,hi返回beanName依赖的其他bean name列表,再依次调用destorySingleton销毁这些bean
从而具体的回调发生在第4步,开头提到,bean在实例化后会以DisposableBeanAdapter存放进disposableBeans中,从而该类实现了具体的回调过程。
三.DisposableBeanAdapter
DisposableBeanAdapter的结构如下,其实现了DisposableBean接口,因而可以如上面说的,在destroySingleton方法进行回调。它在构造方法中对几个重要的属性进行了赋值,用于存储销毁动作相关的信息,包括:
Bean:待销毁bean对象
beanName:待销毁bean的beanName
destroyMethodName:待销毁要调用的方法,该方法来源于destory-method配置项,如果为(inferred),则会将回调方法赋值为close或者shutdown
destoryMethod:destoryMethodName对应的Method对象
beanPostProcessors:需要处理该bean的DestructionAwareBeanPostProcessor回调列表。在实例化DisposableBeanAdapter对象时,会过滤系统中的BeanPostProcessor列表,找出实现DestructionAwareBeanPostProcessor接口,且requiresDestruction方法返回true的实例,用于后续进行回调。(InitDestroyAnnotationBeanPostProcessor类实现了该方法,用以回调@PreDestory注解的方法,CommonAnnotationBeanPostProcessor继承自该类,设置了destroyAnnotationType为PreDestroy.class)
当按照第(二)部分第4步执行时,该类会按照如下顺序执行销毁动作:
如果beanPostProcessors列表不为空,则回调DestructionAwareBeanPostProcessor的postProcessBeforeDestruction方法,即执行@PreDestory注解方法
如果实现了DisposableBean,则回调DisposableBean的destroy方法,即执行DisposableBean接口方法
如果配置了destroy-method,则执行配置的方法,即执行destory-method配置方法
个人公众号:啊驼
本文由博客一文多发平台 OpenWrite 发布!
Spring DestorySingleton流程的更多相关文章
- Spring(六)Spring执行流程
Spring MVC工作流程图 Spring工作流程描述 1. 用户向服务器发送请求,请求被Spring 前端控制Servelt DispatcherServlet捕获: 2. DispatcherS ...
- Java框架之SpringMVC 05-拦截器-异常映射-Spring工作流程
SpringMVC 拦截器 Spring MVC也可以使用拦截器对请求进行拦截处理,可以自定义拦截器来实现特定的功能,自定义的拦截器可以实现HandlerInterceptor接口中的三个方法,也可以 ...
- spring 启动流程
AbstractApplicationContext 分析 启动流程 // Prepare this context for refreshing.prepareRefresh(); 1. // In ...
- Spring MVC流程
这是spring mvc框架结构图,图片是很早在网上撸过来的,具体在哪忘了…… 早期学习Springmvc 并没有具体了解过,只知道这样用很爽,最近了解下基本结构流程及组件所在…… 执行流程 Spri ...
- shiro集成spring&工作流程&DelegatingFilterProxy
1.集成Spring 参考文献: 新建web工程: ehcache-core来自Hibernate wen.xml <?xml version="1.0" encoding= ...
- 概括的描述一下Spring注册流程
Spring经过大神们的构思.编码,日积月累而来,所以,对其代码的理解也不是一朝一夕就能快速完成的.源码学习是枯燥的,需要坚持!坚持!坚持!当然也需要技巧,第一遍学习的时候,不用关注全部细节,不重要的 ...
- Spring管理流程部署——Activiti
pom.xml <!-- activit jar 包 --> <dependency> <groupId>org.activiti</groupId> ...
- Spring GetBean流程
第一节讲解Spring启动的时候说到,Spring内部先解析了所有的配置,加载所有的Bean定义后,再根据需要对Bean进行实例化和初始化.除开Spring自己主动新建的对象,第一次根据Bean定义 ...
- 【面试】Spring 执行流程
Spring Aop的实现原理: AOP 的全称是 Aspect Orient Programming ,即面向切面编程.是对 OOP (Object Orient Programming) 的一 ...
随机推荐
- POJ-1469 COURSES ( 匈牙利算法 dfs + bfs )
题目链接: http://poj.org/problem?id=1469 Description Consider a group of N students and P courses. Each ...
- codeforces 807 E. Prairie Partition(贪心+思维)
题目链接:http://codeforces.com/contest/807/problem/E 题意:已知每个数都能用x=1 + 2 + 4 + ... + 2k - 1 + r (k ≥ 0, 0 ...
- poj 1062 昂贵的聘礼(floyd path的应用)
题目链接:http://poj.org/problem?id=1062 题意就不解释了中问题. 这题用dfs也行.但是感觉还是floyd比较好一点主要是他们交易是有条件的交易总的等级差不能超过m 所以 ...
- CF990C Bracket Sequences Concatenation Problem 思维 第五道 括号经典处理题目
Bracket Sequences Concatenation Problem time limit per test 2 seconds memory limit per test 256 meg ...
- 深入分析Mybatis 使用useGeneratedKeys获取自增主键
摘要 我们经常使用useGenerateKeys来返回自增主键,避免多一次查询.也会经常使用on duplicate key update,来进行insertOrUpdate,来避免先query 在i ...
- mariadb 远程访问报:Host xxx is not allowed to connect to this MariaDb server
刚开始试的是: 结果报错了,哎,这折腾的. 继续折腾,加个密码试试: 再用Navicat试试,果然成功了.
- Android如何管理sqlite
Android中使用SQlite进行数据操作 标签: sqliteandroid数据库sqlintegerstring 2012-02-28 14:21 8339人阅读 评论(2) 举报 分类: a ...
- 微服务SpringCloud之服务网关zuul一
前面学习了Eureka.Feign.Hystrix.Config,本篇来学习下API网关zuul.在微服务架构中,后端服务往往不直接开放给调用端,而是通过一个API网关根据请求的url,路由到相应的服 ...
- 【深入浅出-JVM】(76):classloader
方法 public Class<?> loadClass(String name) throws ClassNotFoundException 通过类名发挥这个类的Class实例 prot ...
- MySQL-注释-Navicat基本使用-复杂查询练习题-解题思路-pymysql操作数据库-SQL注入-05
目录 mysql语句注释 navicat 的基本使用 特色(个人总结) 与数据服务器建立连接 创建&打开数据库.表 创建 打开 修改操作表结构 修改表结构 查询修改操作表数据 基本语句对应的操 ...