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 容器中Bean生命周期之@PostConstruct和@PreDestroy注解

一、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

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

四、小结

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

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

构建顺序如下:

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

销毁顺序如下:

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

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

来源:软件架构

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2019年8月22日
下一篇 2019年8月22日

相关推荐