1.6 自定义Bean的性质

1.6 自定义Bean的性质 #

Version 5.2.2.RELEASE


Spring框架提供了许多接口,可以用来定制bean的性质。本节将其分类如下:

1.6.1 生命周期回调 #

为了与容器对bean生命周期的管理进行交互,可以实现Spring InitializingBeanDisposableBean接口。容器为前者调用afterPropertiesSet(),为后者调用destroy(),以便bean在初始化和销毁bean时执行某些操作。

JSR-250 @PostConstruct@PreDestroy注解通常被认为是在现代Spring应用程序中接收生命周期回调的最佳实践。使用这些注解意味着您的bean没有耦合到特定于Spring的接口。有关详细信息,请参见使用@PostConstruct@PreDestroy

如果不想使用JSR-250注解,但仍想解除耦合,请考虑init-methoddestroy-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配置,可以使用@BeaninitMethod属性。请参阅接收生命周期回调。考虑下面的例子:

<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配置,您可以使用@BeandestroyMethod属性。请参阅接收生命周期回调。考虑下面的定义:

<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类上的公共closeshutdown方法。(因此,任何实现java.lang.AutoCloseablejava.io.Closeable的类都将匹配。)还可以在<beans>元素的default-destroy-method属性上设置这个特殊(推断)值,以将此行为应用于整个bean集(请参见默认初始化和销毁方法)。请注意,这是Java配置的默认行为。

默认初始化和销毁方法 #

1.6.2. ApplicationContextAwareBeanNameAware #

1.6.3 其他Aware接口 #