自定义一个bean的本质
本篇讨论如何自定义一个Bean和这个Bean的本质。
一、生命周期回调简介
要与bean生命周期的容器管理进行交互,可以实现Spring InitializingBean和DisposableBean接口。容器要求 afterPropertiesSet()前者和destroy()后者允许bean在初始化和销毁bean时执行某些操作。
例如源码中的如下操作:
JSR-250 @PostConstruct和@PreDestroy注解通常被认为是在现代Spring应用程序中接收生命周期回调的最佳实践。使用这些注释意味着你的bean没有耦合到Spring特定的接口。有关详细信息,请参阅@PostConstruct和@PreDestroy。
如果您不想使用JSR-250注释,但仍想要移除耦合,请考虑使用init-method和destroy-method对象定义元数据。
例如如下的这些操作:
在内部,Spring框架使用BeanPostProcessor实现来处理它可以找到的任何回调接口并调用适当的方法。如果您需要自定义功能或其他生命周期行为,Spring不提供开箱即用功能,您可以自行实施BeanPostProcessor。
除了初始化和销毁回调之外,Spring管理对象还可以实现Lifecycle接口,以便这些对象可以参与由容器自身生命周期驱动的启动和关闭过程。
二、详解生命周期回调接口
1. 初始化回调
该org.springframework.beans.factory.InitializingBean
接口允许bean在bean的所有必要属性已由容器设置后执行初始化工作。该InitializingBean接口指定了一种方法:
void afterPropertiesSet() throws Exception;
建议您不要使用该InitializingBean接口,因为它不必要地将代码耦合到Spring。或者,使用@PostConstruct注释或指定POJO初始化方法。对于基于XML的配置元数据,您可以使用该init-method属性来指定具有void无参数签名的方法的名称。使用Java配置,您使用的initMethod属性@Bean,请参阅接收生命周期回调。例如,以下内容:推荐
- 方式一:
- Xml配置
<bean id="exampleInitBean" class="examples.ExampleBean" init-method="init"/>
- 实体类
public class ExampleBean {
public void init() {
// do some initialization work
}
}
- 方式二:不推荐
Xml配置文件:
<bean id="exampleInitBean" class="examples.AnotherExampleBean"/>
Java代码:
public class AnotherExampleBean implements InitializingBean {
public void afterPropertiesSet() {
// do some initialization work
}
}
推荐使用方式一,方式一不会将代码耦合到Spring中。
2. 销毁回调
实现org.springframework.beans.factory.DisposableBean接口允许bean在包含它的容器被销毁时获得回调。该 DisposableBean接口指定了一种方法:
void destroy() throws Exception;
建议您不要使用DisposableBean回调接口,因为它不必要地将代码耦合到Spring。或者,使用@PreDestroy