触发 bean 销毁的五种方式

1. 利用 applicationContext 的 close 方法

会触发 @PreDestroy 注解标记的方法

  1. applicationContext.close();

2. 注册销毁钩子

会触发 @PreDestroy 注解标记的方法

  1. ac.registerShutdownHook();

3. 实现 DisposableBean,重写 destory 方法

  1. @Component
  2. public class UserService implements DisposableBean {
  3. @Value("staging")
  4. private String model;
  5. @Override
  6. public void destroy() throws Exception {
  7. }
  8. }

4. 实现了 AutoCloseable 接口

  1. @Component
  2. public class UserService implements AutoCloseable {
  3. @Value("staging")
  4. private String model;
  5. @Override
  6. public void close() throws Exception {
  7. }
  8. }

5. bean 中定义了 close 或 shutdown 方法

注意:只有 @Bean 的方式定义的 bean,才会认识 close 或 shudown 方法

Bean的销毁过程

1. 容器关闭

2. 发布ContextClosedEvent事件

3. 调用LifecycleProcessor的onClose方法

4. 销毁单例Bean

  1. 找出所有DisposableBean(实现了DisposableBean接口的Bean)
  2. 遍历每个DisposableBean
  3. 找出依赖了当前DisposableBean的其他Bean,将这些Bean从单例池中移除掉
  4. 调用DisposableBean的destroy()方法
  5. 找到当前DisposableBean所包含的inner beans,将这些Bean从单例池中移除掉 (inner bean参考https://docs.spring.io/spring-framework/docs/current/spring-framework-reference/core.html#beans-inner-beans)


这里涉及到一个设计模式:
适配器模式**

在销毁时,Spring会找出实现了DisposableBean接口的Bean。