- 要与容器对 bean 生命周期的 Management 进行交互,可以实现 Spring InitializingBean 和 DisposableBean 接口。容器对前者调用 afterPropertiesSet(),对后者调用 destroy(),以使 Bean 在初始化和销毁 Bean 时执行某些操作。
- Spring 框架使用 BeanPostProcessor 实现来处理它可以找到的任何回调接口并调用适当的方法。如果需要自定义功能或其他生命周期行为,可以自己实现 BeanPostProcessor
初始化(Initialization Callbacks)
- org.springframework.beans.factory.InitializingBean 接口允许容器在容器上设置了所有必需的属性后,bean 可以执行初始化工作。 InitializingBean 接口指定一个方法:
void afterPropertiesSet() throws Exception;
示例
- application.xml
<bean id="exampleInitBean" class="examples.ExampleBean"/>
- ExampleBean.java
public class ExampleBean implements InitializingBean {
public void afterPropertiesSet() {
// do some initialization work
}
}
- 不建议使用 InitializingBean 接口,因为它不必要地将代码耦合到 Spring。相对的,可以在<bean/> 上使用 init-method 属性指定具有无效无参数签名的方法的名称
示例
- application.xml
<bean id="anotherExampleBean" class="AnotherExampleBean" init-method="init"/>
- ExampleBean.java
public class AnotherExampleBean {
public void init() {
// do some initialization work
}
}
销毁(Destruction Callbacks)
- 实现 org.springframework.beans.factory.DisposableBean 接口后,当包含 bean 的容器被销毁时,bean 可以获取回调。 DisposableBean 接口指定一个方法:
void destroy() throws Exception;
示例
- application.xml
<bean id="exampleInitBean" class="examples.ExampleBean"/>
- ExampleBean.java
public class ExampleBean implements DisposableBean {
public void destroy() {
// do some destruction work (like releasing pooled connections)
}
}
- 不建议使用 DisposableBean 回调接口 ,因为它不必要地将代码耦合到 Spring。相对的,可以在<bean/> 上使用destroy-method 属性
示例
- application.xml
<bean id="anotherExampleBean" class="AnotherExampleBean" destroy-method="cleanup"/>
- ExampleBean.java
public class AnotherExampleBean {
public void cleanup() {
// do some destruction work (like releasing pooled connections)
}
}
注
- 如果不使用接口的 destroy() 方法销毁容器,还可以通过关闭 ApplicationContext,销毁所有的 bean 并释放所有的资源。 如果需要在关闭应用程序上下文之前进行一些清理工作,可以在实现 SmartLifecycle 接口的 bean 中执行这些操作
默认全局初始化和销毁方法
- 顶层 <beans/> 元素属性上 default-init-method 属性的存在会导致 Spring IoC 容器将 Bean 类上称为 init 的方法识别为初始化方法回调。创建和组装 bean 时,如果 bean 类具有此类方法,则会在适当的时间调用它。同样的,也可以通过使用顶级 <beans/> 元素上的 default-destroy-method 属性类似地 (在 XML 中) 配置 destroy 方法回调。
- 编写应用程序类并使用名为 init() 的初始化回调,而不必为每个 bean 定义配置 init-method 属性。 同样的,可以编写 destory() 的销毁回调,而不必为每个 bean 定义配置 destroy-method 属性。
示例
- DefaultBlogService
public class DefaultBlogService implements BlogService {
private BlogDao blogDao;
public void setBlogDao(BlogDao blogDao)
{
this.blogDao =
blogDao;
}
// this is (unsurprisingly) the initialization callback method
public void init() {
if (this.blogDao == null)
{
throw new
IllegalStateException("The [blogDao] property must be
set.");
}
}
public void destory()
{
if (this.blogDao != null) {
throw new
IllegalStateException("The [blogDao] property destory.");
}
}
}
- application.xml
<beans default-init-method="init" default-destroy-method="destory">
<bean id="blogService" class="com.something.DefaultBlogService">
<property name="blogDao" ref="blogDao" />
</bean>
</beans>
来自 <https://www.docs4dev.com/docs/zh/spring-framework/5.1.3.RELEASE/reference/core.html#beans>