绑定完请刷新页面
取消
刷新

分享好友

×
取消 复制
Spring 容器中 PostConstruct和PreDestroy注解
2019-10-09 08:59:13

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方法

分享好友

分享这个小栈给你的朋友们,一起进步吧。

唠唠云原生
创建时间:2020-05-11 11:26:03
云原生是一种构建和运行应用程序的方法,是一套技术体系和方法论。云原生(CloudNative)是一个组合词,Cloud+Native。 Cloud表示应用程序位于云中,而不是传统的数据中心;Native表示应用程序从设计之初即考虑到云的环境,原生为云而设计,在云上以佳姿势运行,充分利用和发挥云平台的弹性+分布式优势。
展开
订阅须知

• 所有用户可根据关注领域订阅专区或所有专区

• 付费订阅:虚拟交易,一经交易不退款;若特殊情况,可3日内客服咨询

• 专区发布评论属默认订阅所评论专区(除付费小栈外)

技术专家

查看更多
  • 栈栈
    专家
戳我,来吐槽~