1.6 自定义Bean的性质 #
Spring框架提供了许多接口,可以用来定制bean的性质。本节将其分类如下:
1.6.1 生命周期回调 #
为了与容器对bean生命周期的管理进行交互,可以实现Spring InitializingBean
和DisposableBean
接口。容器为前者调用afterPropertiesSet()
,为后者调用destroy()
,以便bean在初始化和销毁bean时执行某些操作。
JSR-250
@PostConstruct
和@PreDestroy
注解通常被认为是在现代Spring应用程序中接收生命周期回调的最佳实践。使用这些注解意味着您的bean没有耦合到特定于Spring的接口。有关详细信息,请参见使用@PostConstruct
和@PreDestroy
。如果不想使用JSR-250注解,但仍想解除耦合,请考虑
init-method
和destroy-method
bean定义元数据。
在内部,Spring框架使用BeanPostProcessor
实现来处理它可以找到的任何回调接口,并调用适当的方法。如果您需要定制某些特性或Spring默认未提供的其他生命周期行为,您可以自己实现BeanPostProcessor
。有关详细信息,请参见容器扩展点。
除了初始化和销毁回调之外,Spring管理的对象还可以实现生命周期接口(Lifecycle
),以便这些对象可以参与由容器自身生命周期驱动的启动和关闭过程。
本节介绍了生命周期回调接口。
初始化时回调 #
org.springframework.beans.factory.InitializingBean
接口允许bean在容器对bean设置了所有必要的属性之后执行初始化工作。InitializingBean
接口指定了一个方法:
void afterPropertiesSet() throws Exception;
fun afterPropertiesSet()
我们建议您不要使用InitializingBean
接口,因为它不必要地将代码和Spring耦合。或者说,我们建议使用@PostConstruct
注解或指定POJO初始化方法。对于基于XML的配置元数据,可以使用init-method
属性指定具有无返回值无参数的方法的名称。如果使用的是Java配置,可以使用@Bean
的initMethod
属性。请参阅接收生命周期回调。考虑下面的例子:
<bean id="exampleInitBean" class="examples.ExampleBean" init-method="init"/>
public class ExampleBean {
public void init() {
// 做某些初始化工作
}
}
class ExampleBean {
fun init() {
// 做某些初始化工作
}
}
前面的示例与下面的示例的效果几乎完全相同:
<bean id="exampleInitBean" class="examples.AnotherExampleBean"/>
public class AnotherExampleBean implements InitializingBean {
@Override
public void afterPropertiesSet() {
// 做某些初始化工作
}
}
class AnotherExampleBean : InitializingBean {
override fun afterPropertiesSet() {
// 做某些初始化工作
}
}
然而,前面两个示例中的第一个并没有将代码与Spring耦合。
销毁时回调 #
实现org.springframework.beans.factory.DisposableBean
接口允许bean在包含它的容器被销毁时获得回调。DisposableBean
接口指定了一种方法:
void destroy() throws Exception;
fun destroy()
我们建议您不要使用DisposableBean
回调接口,因为它不必要地将代码与Spring耦合。或者,我们建议使用@PreDestroy
注解或指定bean定义支持的通用方法。使用基于XML的配置元数据,可以在<bean/>
上使用destroy-method
属性。通过Java配置,您可以使用@Bean
的destroyMethod
属性。请参阅接收生命周期回调。考虑下面的定义:
<bean id="exampleInitBean" class="examples.ExampleBean" destroy-method="cleanup"/>
public class ExampleBean {
public void cleanup() {
// 做某些销毁工作(比如释放池连接)
}
}
class ExampleBean {
fun cleanup() {
// 做某些销毁工作(比如释放池连接)
}
}
前面的定义与下面的定义几乎完全相同:
<bean id="exampleInitBean" class="examples.AnotherExampleBean"/>
public class AnotherExampleBean implements DisposableBean {
@Override
public void destroy() {
// 做某些销毁工作(比如释放池连接)
}
}
class AnotherExampleBean : DisposableBean {
override fun destroy() {
// 做某些销毁工作(比如释放池连接)
}
}
然而,前面两个定义中的第一个并没有将代码耦合到Spring。
可以为<bean>
元素的destroy-method
属性指定一个特殊(推断)值,该值指示Spring自动检测特定bean类上的公共close
或shutdown
方法。(因此,任何实现java.lang.AutoCloseable
或java.io.Closeable
的类都将匹配。)还可以在<beans>
元素的default-destroy-method
属性上设置这个特殊(推断)值,以将此行为应用于整个bean集(请参见默认初始化和销毁方法)。请注意,这是Java配置的默认行为。