初始化回调
实现InitializingBean接口
org.springframework.beans.factory.InitializingBean
在容器为 bean 设置所有必要的属性后,该接口让 bean 执行初始化工作。该InitializingBean
接口指定了一个方法:
1 | void afterPropertiesSet() throws Exception; |
1 | public class ExampleBean implements InitializingBean { |
建议不要使用该InitializingBean
接口,因为它使得代码耦合到 Spring。
JSR-250注解
建议使用@PostConstruct
注释或指定 POJO 初始化方法。
将其在代码中指定的初始化方法上添加注解即可
1 | public class ExampleBean { |
基于xml
对于基于 XML 的配置元数据,您可以使用该init-method
属性来指定具有 void 无参数签名的方法的名称。
1 | <bean id="exampleInitBean" class="examples.ExampleBean" init-method="init"/> |
配置类
在Java配置类中,你可以使用initMethod
的属性
1 | public class ExampleBeans { |
后面的例子没有将代码耦合到Spring
销毁回调
实现DisposableBean接口
实现该org.springframework.beans.factory.DisposableBean
接口可以让 bean 在包含它的容器被销毁时获得回调。该 DisposableBean
接口指定了一个方法:
1 | void destroy() throws Exception; |
我们建议您不要使用DisposableBean
回调接口,因为它不必要地将代码耦合到 Spring。
1 | public class ExampleBean implements DisposableBean { |
JSR-250注解
使用@PreDestroy
注释或指定 bean 定义支持的泛型方法。
1 | public class ExampleBean { |
基于xml
使用基于XML的配置元数据时,您可以使用destroy-method
该属性<bean/>
。随着Java的配置,你可以使用destroyMethod
的属性@Bean
。
1 | <bean id="exampleInitBean" class="examples.ExampleBean" destroy-method="cleanup"/> |
配置类
在配置类中,指定destroyMethod
即可
1 | public class ExampleBeans { |
默认初始化和销毁方法
1 | <beans default-init-method="init"> |
只需要在<beans>标签上指定default-init-method
和default-destroy-method
,spring就会在装配bean时查找每个bean是否存在同名方法,有则调用。
如果bean的命名约定不同,也可以在<bean>指定自身的init-method
和destroy-method
属性来覆盖默认方法
总结
从 Spring 2.5 开始,您可以通过三个选项来控制 bean 生命周期行为:
- 在
InitializingBean
和DisposableBean
回调接口 - 自定义
init()
和destroy()
方法 @PostConstruct
和@PreDestroy
注解。您可以组合这些机制来控制给定的 bean。
为同一个 bean 配置的多个生命周期机制,具有不同的初始化方法,调用如下:
- 带有注释的方法
@PostConstruct
afterPropertiesSet()
由InitializingBean
回调接口定义- 自定义配置
init()
方法
销毁方法以相同的顺序调用:
- 带有注释的方法
@PreDestroy
destroy()
由DisposableBean
回调接口定义- 自定义配置
destroy()
方法