一个Bean的一生,究竟要走完多少路,才能消亡?
摘要:想了解 Spring 中 Bean 的销毁流程么?本文将从 Spring 源码的角度带你一步一步查看 Spring 中的 Bean 销毁时候生命周期的每个方法是如何被调用的。
生命周期流程
在前面的文章一个 Bean 就这样走完了它的一生之 Bean 的出生里面讲解了 Spring 中 Bean 的创建的生命周期,这篇文章再来看一下 Bean 销毁的生命周期。在 Spring 容器被关闭的时候,会调用依次调用 Bean 销毁的生命周期方法,如下图所示:
案例解析
数据库连接池在 Bean 销毁时主动关闭连接
假设现在定义了一个数据库连接池相关的 Bean,使用了 @PreDestroy 注解修饰了它的 shutdown() 方法,当 Spring 容器销毁的时候,它的 shutdown() 方法就会调用,以便实现在程序终止的时候关闭和数据库创建的连接。代码如下:
@Component
public class DatabaseConnectionPool {
private final String url = "jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1";
private final String username = "sa";
private final String password = "";
private final int initialPoolSize = 5;
private Queue<Connection> connectionPool;
private List<Connection> activeConnections;
public DatabaseConnectionPool() {
this.connectionPool = new ConcurrentLinkedQueue<>();
this.activeConnections = new ArrayList<>();
}
@PostConstruct
public void init() {
//初始化连接
}
@PreDestroy
public void shutdown() {
for (Connection conn : activeConnections) {
try {
if (conn != null && !conn.isClosed()) {
conn.close();
System.out.println("DatabaseConnectionPool: 关闭连接: " + conn);
}
} catch (SQLException e) {
System.err.println("DatabaseConnectionPool: 关闭连接失败: " + e.getMessage());
}
}
connectionPool.clear();
activeConnections.clear();
}
}
Bean 销毁源码解析
DisposableBean 的注册
在 Bean 创建的过程中,在 AbstractAutowireCapableBeanFactory 的 doCreateBean() 方法中会判断一个 Bean 是否应该在容器关闭的时候被销毁,如果需要的话就会为当前 Bean 注册一个 DisposableBeanAdapter的对象。
