Spring注解驱动开发之使用InitializingBean接口和DisposableBean接口指定初始化和销毁的方法

1. 前言

上一篇文章 中,我们讲述了如何使用 @Bean 注解来指定 bean 初始化和销毁的方法,具体的用法就是在 @Bean 注解中使用 initMethod 属性和 destroyMethod 属性来指定初始化方法和销毁方法。除此之外,Spring 中还提供了 InitializingBean 接口和 DisposableBean 接口的方式来指定 bean 初始化和销毁的方法

2. InitializingBean 接口

2.1. InitializingBean 接口概述

Spring 中提供了一个 InitializingBean 接口,该接口为 bean 提供了属性填充完成后的处理方法,它只包括 afterPropertiesSet 方法,凡是继承该接口的类,在 bean 的属性填充完成后都会执行该方法

public interface InitializingBean {
   

	void afterPropertiesSet() throws Exception;
}

根据 InitializingBean 接口中提供的 afterPropertiesSet() 方法的名字不难推断出,afterPropertiesSet() 方法是在属性赋好值之后调用的

2.2. Spring 源码中何时调用 InitializingBean 接口

我们定位到 Spring 中的org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory 这个类里面的 invokeInitMethods() 方法中,来查看 Spring 加载 bean 的方法

关于 invokeInitMethods() 方法调用详情:https://blog.youkuaiyun.com/weixin_38192427/article/details/116449682

在这里插入图片描述
我们可以初步得出如下信息:

  • Springbean 提供了两种初始化的方式,第一种是实现 InitializingBean 接口

    • 第二种是在 xml 配置文件中使用 init-method 标签来指定
    • 第二种是在 @Bean 注解中通过 initMethod 属性来指定

两种方式可以同时使用,同时使用先调用 afterPropertiesSet() 方法,后执行 init-method 指定的方法

  • 实现 InitializingBean 接口是直接调用 afterPropertiesSet() 方法,与通过反射调用 init-method 指定的方法相比,效率相对来说要高点。但是 init-method 方式消除了对 Spring 的依赖
  • 如果调用 afterPropertiesSet() 方法时出错,那么就不会调用 init-method 指定的方法了

3. DisposableBean 接口

3.1. DisposableBean 接口概述

实现 DisposableBean 接口的 bean 在销毁前,Spring 将会调用 DisposableBean 接口的 destroy() 方法。也就是说我们可以实现 DisposableBean 这个接口来自定义的销毁逻辑

bean 的销毁源码详情:在这里,重点关注 DisposableBeanAdapter.hasDestroyMethod(bean, mbd) 方法

public interface DisposableBean {
   

	void destroy() throws Exception;
}
  • Springbean 提供了两种销毁 bean 的方式,第一种是实现 DisposableBean 接口

    • 第二种是在 xml 配置文件 destroy-method 标签来指定
    • 第二种是在 @Bean 注解中通过 destroyMethod 属性来指定

3.2. DisposableBean 接口注意事项

多实例 bean 的生命周期不归 Spring 容器来管理,这里的 DisposableBean 接口中的方法是由 Spring 容器来调用的,所以如果一个多实例 bean 实现了 D

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值