首页 > 其他分享 >关于@PostConstruct与@PreDestroy注解的使用详解

关于@PostConstruct与@PreDestroy注解的使用详解

时间:2022-11-30 10:24:38浏览次数:68  
标签:spring PostConstruct PreDestroy 详解 注解 执行 方法

一、@PostConstruct和@PreConstruct介绍

从JavaEE5规范开始,Servlet增加了两个影响Servlet生命周期的注解(Annotation):@PostConstruct和@PreConstruct。
这两个注解被用来修饰一个非静态的void()方法,而且这个方法不能有抛出异常声明。

二、@PostConstruct的使用

@PostContruct是spring框架的注解,在方法上加该注解会在项目启动的时候执行该方法,也可以理解为在spring容器初始化的时候执行该方法。

2.1 @PostConstruct在项目中的用处

2.1.1 spring项目加载数据字典

@PostConstruct注解的方法在项目启动的时候执行这个方法,也可以理解为在spring容器启动的时候执行,可作为一些数据的常规化加载,比如数据字典之类的。

2.1.2 spring项目的定时任务

spring自带的@schedule,没有开关,项目启动总会启动一个线程;做项目的时候就使用Java的timer,这个设置开关即可自由的控制,关闭的时候,不会启动线程;Java的timer也需要找到一个启动类,可以放到main函数里面启动,这样的话,代码的耦合性太高了,而使用PostConstruct是很干净的。

spring中Constructor、@Autowired、@PostConstruct的顺序

其实从依赖注入的字面意思就可以知道,要将对象p注入到对象a,那么首先就必须得生成对象p与对象a,才能执行注入。
所以,如果一个类A中有个成员变量p被@Autowired注解,那么@Autowired注入是发生在A的构造方法执行完之后的。

如果想在生成对象时候完成某些初始化操作,而偏偏这些初始化操作又依赖于依赖注入,那么就无法在构造函数中实现。
为此,可以使用@PostConstruct注解一个方法来完成初始化,@PostConstruct注解的方法将会在依赖注入完成后被自动调用。

Constructor >> @Autowired >> @PostConstruct

2.2 特点:

  • 只有非静态方法能使用此注解
  • 被注解的方法不得有任何参数
  • 被注解的方法返回值必须为void
  • 被注解方法不得抛出已检查异常
  • 此方法只会被执行一次

2.3 使用

@PostConstruct public void someMethod(){}

或者

public @PostConstruct void someMethod(){}

被@PostConstruct修饰的方法会在服务器加载Servle的时候运行,并且只会被服务器执行一次。
@PostConstruct在构造函数之后执行,init()方法之前执行。PreDestroy()方法在destroy()方法执行执行之后执行!

被注解的Servlet生命周期

需要注意的是,注解会多多少少地影响到服务器的启动速度。
服务器在启动时候会遍历Web应用的WEB-INF/classes下的所有class文件与WEB-INF/lib下的所有jar文件,以检查哪些类使用了注解。
如果应用程序中没有使用任何注解,可以在Web.xml中设置的metadata-complete属性为true。
(支持@PostConstruct和 @PreDestroy的服务器需要支持Servlet2.5规范。Tomcat5.x仅支持Servlet2.4规范。)

三、@PreDestroy注解使用

在开发中我们如果要在关闭spring容器后释放一些资源,通常的做法有如下几种:
1.在方法上加上@PreDestroy注解
2.实现DisposableBean接口,实现其destroy方法

3.1 使用场景

可以在bean实例被销毁时,做一些清理工作,比如关闭一些数据库或者网络的连接,记录一些系统关闭的日志信息等。
执行时机
(1)Servlet中:在Servlet被服务器卸载的时候执行,并且只会执行一次,被该注解修饰的方法会在Servlet的destroy方法执行之后,在Servlet被彻底卸载完成之前执行。
(2)Spring中:在Spring发布容器关闭事件之后,在执行Bean的destroy方法之前执行。

3.2 @PreDestroy使用示例

例:在容器关闭的时候,删除系统缓存的和用户信息相关的缓存文件
标注在一个非静态的void方法上,而且被标注的方法不能声明抛出异常:

点击查看代码
@Service
public class UserService {

  @PreDestroy
  public void destroyUserService() {
    // 可以在该步骤中清理系统的缓存文件
    FileUtils.clearAllUserCacheFile();
    System.out.println("context close...");

  }
}

标签:spring,PostConstruct,PreDestroy,详解,注解,执行,方法
From: https://www.cnblogs.com/imagine-xw/p/16937618.html

相关文章

  • 如何实现与第三方工具的无缝连接,taosAdapter 具体应用详解
    小 T 导读:taosAdapter是 ​​TDengine​​ 这款​​时序数据库​​(​​TimeSeriesDatabase​​)的配套工具,是TDengine集群和应用程序之间的桥梁和适配器。当我们需......
  • 指针详解(day18)
    目录指针基础:指针就是地址,在c语言中指针与指针变量大部分情况下不做区分。指针变量在内存中通常以4/8个字节的空间存储,根据系统位数确定。实例intmain(){inta=10;in......
  • 详解支持向量机-基于SVM的ROC曲线和AUC面积【菜菜的sklearn课堂笔记】
    视频作者:菜菜TsaiTsai链接:【技术干货】菜菜的机器学习sklearn【全85集】Python进阶_哔哩哔哩_bilibili手动绘制SVM的ROC曲线对于ROC曲线,我们要注意的是正类的概率和阈......
  • 计算机网络详解(基础篇)1-3章(韩立刚老师)
    1.lnternet发展网络:让部分电脑实现短距通信(较小范围:如实验室)互联网:路由器连接多个网络形成互联网,实现远距通信。(任意部门或单位或个体都可接入)通讯介质可以是光纤或无......
  • Unity--Cinemachine官方实例详解
    1.2DCamera搭建一个快速场景,MainCamera选择Orthographic。在Cinemachine下有Create2DCamera,在生成的相机中设置follow,同时注意body的设置,如下图所示在虚拟相机中还需要......
  • 插头DP详解
    前言图片来源:我老师的PDF因为我不会画图前排膜拜一波(插头dp虽然模版难度就是黑,但是我认为并不难。我认为dp的难度排序:ddp(动态DP,P4719)>分治dp>插头dp>决策单调性优化dp>......
  • services资源+pod详解
    services资源+pod详解一、Service虽然每个Pod都会分配一个单独的PodIP,然而却存在如下两问题:PodIP会随着Pod的重建产生变化PodIP仅仅是集群内可见的虚拟IP,外部无......
  • Day26:内部类的详解
    内部类1.1内部类概述内部类:就是在一个类中定义另外一个类。例如我们在A类中定义一个B类,那么B类就是A类的内部类,A则是B的外部类。好比我们的手机是一个类,而手机内部的零......
  • Rockwell EDI 855 采购订单确认报文详解
    罗克韦尔自动化与国内12家授权分销商,124家认可的系统集成商,30多家亚太区的Encompass战略合作伙伴和全球战略联盟,共同为制造业企业提供广泛的世界一流的产品、解决方案与......
  • Redis详解(二)——AOF
    转载Redis详解(二)——AOF前言RDB持久化存在一个缺点是一定时间内做一次备份,如果redis意外down掉的话,就会丢失最后一次快照后的所有修改(数据有丢失)。对于数据完整性要......