玖叶教程网

前端编程开发入门

Spring 容器中Bean生命周期之@PostConstruct和@PreDestroy注解

Spring 容器中的 Bean 是有生命周期的,Spring 允许在 Bean 在初始化完成后以及 Bean 销毁前执行特定的操作,我们既可以通过实现 InitializingBean/DisposableBean 接口来定制初始化之后 / 销毁之前的操作方法,也可以通过 <bean> 元素的 init-method/destroy-method 属性指定初始化之后 / 销毁之前调用的操作方法。

JSR-250 为初始化之后/销毁之前方法的指定定义了两个注释类,分别是 @PostConstruct 和 @PreDestroy,这两个注释只能应用于方法上。标注了 @PostConstruct 注释的方法将在类实例化后调用,而标注了 @PreDestroy 的方法将在类销毁之前调用。

只需要在方法前标注 @PostConstruct 或 @PreDestroy ,这些方法就会在 Bean 初始化后或销毁之前被 Spring 容器执行了。

我们知道,不管是通过实现 InitializingBean /DisposableBean 接口,还是通过 <bean> 元素的init-method/destroy-method 属性进行配置,都只能为 Bean 指定一个初始化 / 销毁的方法。但是使用@PostConstruct 和 @PreDestroy 注释却可以指定多个初始化 / 销毁方法,那些被标注 @PostConstruct 或 @PreDestroy 注释的方法都会在初始化 / 销毁时被执行。

通过以下的测试代码,您将可以看到 Bean 的初始化 / 销毁方法是如何被执行的。

一、Spring @PostConstruct and @PreDestroy

下面是一个简单的Spring bean-MyBean,应用了@PostConstruct和@PreDestroy注解。

package com.rickie.beanlifecycle;

import javax.annotation.PostConstruct;

import javax.annotation.PreDestroy;

public class MyBean {

public MyBean() {

System.out.println("MyBean instance created");

}

@PostConstruct

private void init() {

System.out.println("Verifying Resources");

}

@PreDestroy

private void shutdown() {

System.out.println("Shutdown All Resources");

}

public void close() {

System.out.println("Closing All Resources");

}

}

注意:上面也定义了一个close() 方法,用来检查当bean销毁的时候是否会被调用。

二、MyConfiguration配置类

下面是一个简单的Spring 配置类,MyConfiguration类的代码如下:

package com.rickie.beanlifecycle;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

@Configuration

public class MyConfiguration {

@Bean

public MyBean myBean() {

return new MyBean();

}

}

三、main类

下面是main类,其中创建spring上下文并获得很少的MyBean实例。

package com.rickie.beanlifecycle;

import javax.annotation.PostConstruct;

import javax.annotation.PreDestroy;

public class MyBean {

public MyBean() {

System.out.println("MyBean instance created");

}

@PostConstruct

private void init() {

System.out.println("Verifying Resources");

}

@PreDestroy

private void shutdown() {

System.out.println("Shutdown All Resources");

}

public void close() {

System.out.println("Closing All Resources");

}

}

运行上述代码,查看输出结果:

MyBean instance created

Verifying Resources

myBean1.hashCode()=1572098393

myBean2.hashCode()=1572098393

Shutdown All Resources

Closing All Resources

四、小结

@PostConstruct:在bean创建完成并且属性赋值完成;来执行初始化方法。

@PreDestroy:在容器销毁bean之前,通知我们进行清理工作。

构建顺序如下:

构造器-->自动注入-->@PostConstrut 方法 -->InitializingBean-->xml中配置init方法

销毁顺序如下:

@PreDestroy 方法 --DisposableBean-->xml中destroy-method方法

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言