当前位置: 首页 > article >正文

Spring销毁的几种实现

有这3种方法,但是程序执行完成并没有打印出来。

一定要手动close.手动执行后会调用如下逻辑:

org.springframework.context.support.AbstractApplicationContext#doClose

org.springframework.context.support.AbstractApplicationContext#destroyBeans

org.springframework.beans.factory.support.DefaultSingletonBeanRegistry#destroySingletons

我们要注意这个disposableBeans的值从哪里来的?

doCreateBean结束后会注册一个销毁方法。

org.springframework.beans.factory.support.AbstractBeanFactory#registerDisposableBeanIfNecessary

看这个方法:

org.springframework.beans.factory.support.AbstractBeanFactory#requiresDestruction

org.springframework.beans.factory.support.DisposableBeanAdapter#hasDestroyMethod

如果该bean实现了DisposableBean或者实现AutoCloseable接口,如果都没有实现就判断该bean上是否写了销毁方法,如果没有的话使用默认的(inferred)方法,在判断bean是是否有close或者shutdown方法,如果有的话就返回该销毁方法。

或者自己注入一个DestructionAwareBeanPostProcessor,重写该方法,然后返回true即可

org.springframework.beans.factory.support.DisposableBeanAdapter#DisposableBeanAdapter(java.lang.Object, java.lang.String, org.springframework.beans.factory.support.RootBeanDefinition, java.util.List<org.springframework.beans.factory.config.BeanPostProcessor>, java.security.AccessControlContext)

真正的销毁方法处理逻辑:

org.springframework.beans.factory.support.DisposableBeanAdapter#destroy

1.

先执行@PreDestroy方法,也是通过InitDestroyAnnotationBeanPostProcessor该方法反射执行的。

2.执行DisposableBean方法

3.反射执行@Bean里面的方法

问题1:如果@Bean写了销毁的方法,但实际上没有该方法会发生什么?

如果找不到直接报错:

销毁方法可以带参数吗?如果可以的话,可以带多少个参数?以及参数类型

从代码可以看出:可以带参数,但只能带一个参数,而且参数类型只能是boolean,反射的时候默认给true。

注意这里的销毁方法有个适配器模式。DisposableBeanAdapter


http://www.kler.cn/a/8097.html

相关文章:

  • 《C++在金融领域的技术革命:高效、安全与创新的融合》
  • 【机器学习】机器学习中用到的高等数学知识-2.概率论与统计 (Probability and Statistics)
  • 【go从零单排】Timer、Epoch 时间函数
  • K8s进阶使用
  • 微信小程序=》基础=》常见问题=》性能总结
  • 深入理解接口测试:实用指南与最佳实践5.0(一)
  • 【vSphere | Python】vSphere Automation SDK for Python Ⅵ—— VM Guest Processes APIs
  • 实时决策系统中 OpenMLDB 的常见架构整合方式
  • 【微信小程序-原生开发】系列教程目录(已完结)
  • 只依赖Tensorrt和opencv的yolov5源代码
  • GPT的未来--基于标准接口的由计算机和无数工业软件构成的联合体
  • 青少年CTF训练平台-WEB-部分wp
  • vue给input框属性赋值的方法
  • Android系统重要组件AMS
  • 【Spring】4—声明式事务
  • 【Mysql系列】——详细剖析数据库中的存储引擎
  • Java面向对象三剑客之——继承
  • Burp Suite的使用(常用模块)
  • python基础-元组
  • 【gRPC】第1篇 全面讲解RPC原理(必收藏)
  • egg编写用户点赞的接口
  • 思维导图手撕MyBatis源码
  • Spring中的循环依赖是什么?如何解决它?
  • HTB-Passage
  • Kafka源码分析之Producer数据发送流程(四)
  • SpringBoot项目中web静态资源的一些问题