触发 bean 销毁的五种方式
1. 利用 applicationContext 的 close 方法
会触发 @PreDestroy
注解标记的方法
applicationContext.close();
2. 注册销毁钩子
会触发 @PreDestroy
注解标记的方法
ac.registerShutdownHook();
3. 实现 DisposableBean,重写 destory 方法
@Component
public class UserService implements DisposableBean {
@Value("staging")
private String model;
@Override
public void destroy() throws Exception {
}
}
4. 实现了 AutoCloseable 接口
@Component
public class UserService implements AutoCloseable {
@Value("staging")
private String model;
@Override
public void close() throws Exception {
}
}
5. bean 中定义了 close 或 shutdown 方法
注意:只有 @Bean 的方式定义的 bean,才会认识 close 或 shudown 方法
Bean的销毁过程
1. 容器关闭
2. 发布ContextClosedEvent事件
3. 调用LifecycleProcessor的onClose方法
4. 销毁单例Bean
- 找出所有DisposableBean(实现了DisposableBean接口的Bean)
- 遍历每个DisposableBean
- 找出依赖了当前DisposableBean的其他Bean,将这些Bean从单例池中移除掉
- 调用DisposableBean的destroy()方法
- 找到当前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。