一个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的对象。
阅读全文