前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >你会用@PostConstruct和@PreDestroy不?Java9+中的替代方案知道不?

你会用@PostConstruct和@PreDestroy不?Java9+中的替代方案知道不?

作者头像
Guide哥
发布2020-05-07 16:46:39
5.5K0
发布2020-05-07 16:46:39
举报
文章被收录于专栏:JavaGuide

@PostConstruct@PreDestroy 是两个作用于Servlet生命周期的注解,相信从 Servlet 开始学 Java 后台开发的同学对他应该不陌生。

被这两个注解修饰的方法可以保证在整个 Servlet 生命周期只被执行一次,即使 Web 容器在其内部中多次实例化该方法所在的 bean。

这两个注解分别有什么作用呢

  1. @PostConstruct : 用来修饰方法,标记在项目启动的时候执行这个方法,一般用来执行某些初始化操作比如全局配置。PostConstruct 注解的方法会在构造函数之后执行,Servlet 的init()方法之前执行。
  2. @PreDestroy : 当 bean 被 Web 容器的时候被调用,一般用来释放 bean 所持有的资源。。PostConstruct 注解的方法会在Servlet 的destroy()方法之前执行。

被这个注解修饰的方法需要满足下面这些基本条件:

  • 非静态
  • 该方法必须没有任何参数,除非在拦截器的情况下,在这种情况下,它接受一个由拦截器规范定义的InvocationContext对象
  • void()也就是没有返回值
  • 该方法抛出未检查的异常
  • ......

我们新建一个 Spring 程序,其中有一段代码是这样的,输出结果会是什么呢?

代码语言:javascript
复制

import org.springframework.context.annotation.Configuration;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

@Configuration
public class MyConfiguration {
    public MyConfiguration() {
        System.out.println("构造方法被调用");
    }

    @PostConstruct
    private void init() {
        System.out.println("PostConstruct注解方法被调用");
    }

    @PreDestroy
    private void shutdown() {
        System.out.println("PreDestroy注解方法被调用");
    }
}


输出结果如下:

但是 J2EE已在Java 9中弃用 @PostConstruct@PreDestroy这两个注解 ,并计划在Java 11中将其删除。我们有什么更好的替代方法吗?当然有!而且,我比较推荐使用这种方式。

代码语言:javascript
复制
package cn.javaguide.config;

import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MyConfiguration2 implements InitializingBean, DisposableBean {
    public MyConfiguration2() {
        System.out.println("构造方法被调用");
    }

    @Override
    public void afterPropertiesSet() {
        System.out.println("afterPropertiesSet方法被调用");
    }

    @Override
    public void destroy() {
        System.out.println("destroy方法被调用");
    }

}

输出结果如下,可以看出实现Spring 提供的 InitializingBeanDisposableBean接口的效果和使用@PostConstruct@PreDestroy 注解的效果一样。

如果你还是非要使用 Java 9 及以后的版本使用 @PostConstruct@PreDestroy 这两个注解的话,你也可以手动添加相关依赖。

Maven:

代码语言:javascript
复制
<dependency>
    <groupId>javax.annotation</groupId>
    <artifactId>javax.annotation-api</artifactId>
    <version>1.3.2</version>
</dependency>

Gradle:

代码语言:javascript
复制
compile group: 'javax.annotation', name: 'javax.annotation-api', version: '1.3.2'

“源码地址:https://github.com/Snailclimb/springboot-guide/tree/master/source-code/basis/life-cycle-annotation”

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-02-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 JavaGuide 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档