目录
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
我们可以初步得出如下信息:
-
Spring
为bean
提供了两种初始化的方式,第一种是实现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;
}
-
Spring
为bean
提供了两种销毁bean
的方式,第一种是实现DisposableBean
接口- 第二种是在
xml
配置文件destroy-method
标签来指定 - 第二种是在
@Bean
注解中通过destroyMethod
属性来指定
- 第二种是在
3.2. DisposableBean
接口注意事项
多实例 bean
的生命周期不归 Spring
容器来管理,这里的 DisposableBean
接口中的方法是由 Spring
容器来调用的,所以如果一个多实例 bean
实现了 D