Spring DestorySingleton流程

摘要:
destroySingletons方法如下所示,这是相对清晰的:如前所述,DefaultSingletonBeanRegistry使用Map缓存所有单实例实例。对于对象破坏,只需将其从地图中移除即可。如前一节所述,disposableBeans存储销毁时需要方法回调的DisposableBeanAdapter对象。键是对应的bean名称,在bean初始化后将判断并存储该名称。这里将优先考虑销毁这些豆子。以下重点介绍destroySingleton方法。III DisposableBeanAdapter的结构如下。它实现DisposableBean接口,因此可以在上面提到的destroySingleton方法中调用它。

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

一.销毁流程

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

file

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

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

二.destroySingleton

file

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

  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)

file

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

file

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

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

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

file

个人公众号:啊驼

免责声明:文章转载自《Spring DestorySingleton流程》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇oh my zsh网络工具汇总下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

CAS单点登录------未认证授权服务

问题背景:之前我使用的127.0.0.1进行CAS直接url进行过滤!后来我用nginx进行反向代理出现问题:如下图第一眼,就在内心想,草这什么鬼!调试了五分钟发现还是不行!  网上各种教程!  半小时过去了!我吧配置文件自己看看!    出现这样问题:原因是CAS 的服务认真之前先有个REgx的正则判断,目录如上看这个正则时候,我瞬间明白了,我下面这个问题...

Element plus的tree组件实现单选和搜索功能

--elementplus树组件实现单选及搜索功能--˃Elementplus树组件实现单选及搜索功能获取选中的节点//给节点添加classconstcustomNodeClass==˃{if{return'no-checkbox-node';}returnnull;};exportdefault{name:'tree-radio',data(){retur...

数据可视化之powerBI技巧(十四)采悟:PowerBI中自制中文单位万和亿

最令人不快的事情之一是数据单元的设置。现在让我们看看如何通过设置测量值来切换单位。需要动态选择1万元和1亿元的单位进行显示。首先,手动创建单位表,然后使用单位表中的[unit]字段生成切片器。下一步是建立销售衡量标准。销售额=总和('订单'[销售额])为了按过滤单位显示销售额,SELECTEDVALUE函数可以根据切片器选择动态更改分母。如果切片器未进行任何...

element-ui表格el-table回显时默认全选数据

1、html代码˂el-table-columntype="selection"width="45"...

Selenium操作示例——鼠标悬停显示二级菜单,再点击二级菜单或下拉列表

这两天在python中玩selenium时,我遇到了一个问题,那就是鼠标移动到页面上的一个按钮或菜单,二级菜单或下拉菜单自动弹出,然后二级菜单或者下拉列表自动点击。...

sqlite3 数据类型 批量插入

SQLite3采用动态数据类型。存储值的数据类型与值本身相关,而不是由其字段类型决定。SQLite3的动态数据类型可以向后兼容其他数据库常用的静态类型,这意味着在使用静态数据类型的数据库中使用的数据表也可以在SQLite3中使用。在SQLite2数据库中,除了声明为主键的INTEGER列外,任何列都可以存储属于任何存储类型的值。...