前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >@PostConstruct与@PreDestroy

@PostConstruct与@PreDestroy

作者头像
半条命专刊
发布2020-09-14 14:57:11
6560
发布2020-09-14 14:57:11
举报

自从Java EE5 之后就引入了@PostConstruct和@PreDestroy,这两个作用于Servlet生命周期的注解,实现Bean初始化之前和销毁之前的自定义操作。此文主要说明@PostConstruct。

官方@PostConstruct的API使用说明如下:

代码语言:javascript
复制
‍PostConstruct 注释用于在依赖关系注入完成之后需要执行的方法上,
以执行任何初始化。此方法必须在将类放入服务之前调用。支持依赖关系
注入的所有类都必须支持此注释。即使类没有请求注入任何资源,用 
PostConstruct 注释的方法也必须被调用。只有一个方法可以用此
注释进行注释。应用 PostConstruct 注释的方法必须遵守以下所有
标准:该方法不得有任何参数,除非是在 EJB 拦截器 (interceptor)
 的情况下,根据 EJB 规范的定义,在这种情况下它将带有一个 
 InvocationContext 对象 ;该方法的返回类型必须为 void;
 该方法不得抛出已检查异常;应用 PostConstruct 的方法可以
 是 public、protected、package private 或 private;
 除了应用程序客户端之外,该方法不能是 static;该方法可以是 
 final;如果该方法抛出未检查异常,那么不得将类放入服务中,
 除非是能够处理异常并可从中恢复的 EJB。

总结为以下几点:

  • 只有一个方法可以使用此注释进行注解;
  • 被注解方法不得有任何参数;
  • 被注解方法返回值为void;
  • 被注解方法不得抛出已检查异常;
  • 被注解方法需是非静态方法;
  • 此方法只会被执行一次;

两个注解加入之后,Servlet执行流程图:

在具体Bean的实例化过程中,@PostConstruct注释的方法,会在构造方法之后,init方法之前进行调用。

下面做一个实例简单介绍一下:

SjjsAjjsJscsCache方法(提供缓存数据):

代码语言:javascript
复制
package ***.***.***.sjjs.meta.cache;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import javax.annotation.PostConstruct;
import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import ***.****.module.sjjs.****.constants.GeneralConstants.Jscs;
import ***.****.module.sjjs.****.SjjsAjjsJscsEntity;
import ***.****.module.sjjs.***.SjjsAjjsJscsMapper;
import ***.****.module.sjjs.****.model.JscsMeta;
import lombok.extern.slf4j.Slf4j;
/**
 * 检索-参数
 */
@Component
@Slf4j
public class SjjsAjjsJscsCache {
    // ==============================Fields===========================================
    private volatile JscsMeta[] jscsCache = new JscsMeta[0];
    @Autowired
    private SjjsAjjsJscsMapper sjjsAjjsJscsMapper;
    // ==============================Methods==========================================
    /**
     * 获得全部关键词
     * @return 元数据列表
     */
    public String[] findAllGjc() {
        Set<String> gjcSet = new HashSet<>();
        for (JscsMeta item : jscsCache) {
            String jsbm = StringUtils.trim(item.getJsbm());
            String jszmc = StringUtils.trim(item.getJszmc());
            if (Jscs.JSBM_GJC.equals(jsbm) && StringUtils.isNotEmpty(jszmc)) {
                gjcSet.add(jszmc);
            }
        }
        return gjcSet.toArray(ArrayUtils.EMPTY_STRING_ARRAY);
    }
    /**
     * 获得全部检索参数
     * @return 检索参数列表
     */
    public JscsMeta[] findAll() {
        return jscsCache;
    }
    /**
     * 刷新元数据缓存
     */
    @PostConstruct
    public void reload() {
        log.info("#SJJS-AJJS-JSCS-CACHE.RELOAD -> [START]");
        // 查询配置数据
        List<SjjsAjjsJscsEntity> jscsList = sjjsAjjsJscsMapper.findList();
        // 缓存结果
        this.jscsCache = jscsList.stream().map(e -> JscsMeta.builder()//
                .jsbm(e.getJsbm())// 检索编码
                .jsmc(e.getJsmc())// 检索名称
                .jszbm(e.getJszbm())// 检索值编码
                .jszmc(e.getJszmc()) // 检索值名称PreDestroy
                .build())//
                .toArray(JscsMeta[]::new);
        log.info("#SJJS-AJJS-JSCS-CACHE.RELOAD -> {" + jscsList.size() + "} [SUCCESS]");
    }
}

执行结果:

代码语言:javascript
复制
#SJJS-AJJS-JSCS-CACHE.RELOAD -> [START]
#SJJS-AJJS-JSCS-CACHE.RELOAD -> {********************}

使用此注解时会影响到服务的启动时间。服务器在启动时会扫描WEB-INF/classes的所有文件和WEB-INF/lib下的所有jar包。

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

本文分享自 程序猿那点儿事儿 微信公众号,前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档