@PostConstruct注解和@PreDestroy注解

news/2025/2/12 22:55:37/

前言

@Bean注解指定初始化和销毁的方法,也介绍了使用InitializingBean和DisposableBean来处理bean的初始化和销毁。JDK中还提供了两个注解能够在bean创建完成并且属性赋值完成之后执行一些初始化工作和在容器销毁bean之前通知我们进行一些清理工作。

1.@PostConstruct注解和@PreDestroy注解

1.1.@PostConstruct注解

@PostConstruct它是Java自己的注解,是JSR-250规范里面定义的一个注解。
@PostConstruct注解的源码,如下所示。

package javax.annotation;import java.lang.annotation.*;
import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.RetentionPolicy.*;@Documented
@Retention (RUNTIME)
@Target(METHOD)
public @interface PostConstruct {
}

从源码可以看出,@PostConstruct注解是Java中的注解,并不是Spring提供的注解

@PostConstruct注解被用来修饰一个非静态的void()方法。被@PostConstruct注解修饰的方法会在服务器加载Servlet的时候运行,并且只会被服务器执行一次。被@PostConstruct注解修饰的方法通常在构造函数之后,init()方法之前执行。

通常我们是会在Spring框架中使用到@PostConstruct注解的,该注解的方法在整个bean初始化中的执行顺序如下:

Constructor(构造方法)→@Autowired(依赖注入)→@PostConstruct(注释的方法)

1.2.@PreDestroy注解

@PreDestroy注解同样是Java提供的,它也是JSR-250规范里面定义的一个注解。看下它的源码,如下所示。

package javax.annotation;import java.lang.annotation.*;
import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.RetentionPolicy.*;@Documented
@Retention (RUNTIME)
@Target(METHOD)
public @interface PreDestroy {
}

被@PreDestroy注解修饰的方法会在服务器卸载Servlet的时候运行,并且只会被服务器调用一次,类似于Servlet的destroy()方法。被@PreDestroy注解修饰的方法会在destroy()方法之后,Servlet被彻底卸载之前执行。执行顺序如下所示:

调用destroy()方法→@PreDestroy→destroy()方法→bean销毁

1.3.小结

@PostConstruct和@PreDestroy是Java规范JSR-250引入的注解,定义了对象的创建和销毁工作,同一期规范中还有@Resource注解,Spring也支持了这些注解。

2.案例

创建一个Dog类,如下所示

package com.tianxia.springannotation.entity;import lombok.Data;import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import java.io.Serializable;/*** @author liqb* @date 2023-04-28 10:27**/
@Data
public class Dog implements Serializable {public Dog() {System.out.println("dog constructor...");}/*** 在对象创建完成并且属性赋值完成之后调用* @author liqb* @date 2023-04-28 10:28*/@PostConstructpublic void init() {System.out.println("dog...@PostConstruct...");}/*** 在容器销毁(移除)对象之前调用* @author liqb* @date 2023-04-28 10:28*/@PreDestroypublic void destory() {System.out.println("dog...@PreDestroy...");}
}

在Dog类中,提供了构造方法、init()方法以及destroy()方法,还使用了@PostConstruct注解和@PreDestroy注解来分别标注init()方法和destroy()方法。

在MainConfigOfLifeCycle配置类中配置Dog的bean对象

/*** 创建dog的bean对象* @author liqb* @date 2023-04-27 11:53* @return*/
@Bean
public Dog dog() {return new Dog();
}

运行测试方法,输出的结果信息如下所示

@Test
public void test01() {// 1. 创建IOC容器AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfigOfLifeCycle.class);// 关闭容器applicationContext.close();
}

在这里插入图片描述

从输出的结果信息中可以看出,被@PostConstruct注解修饰的方法是在bean创建完成并且属性赋值完成之后才执行的,而被@PreDestroy注解修饰的方法是在容器销毁bean之前执行的,通常是进行一些清理工作。


http://www.ppmy.cn/news/53192.html

相关文章

【ES6】ES6一些基本用法:

文章目录 一、从对象obj中取值1、不好的2、好的 二、合并两个数组,合并两个对象1、不好的2、好的 三、拼接字符串1、不好的2、好的 四、关于if中判断条件1、不好的2、好的 五、关于列表搜索六、关于扁平化数组七、关于获取对象属性值八、关于添加对象属性、九、关于…

第一节 ogre源码编译与安装

一. 电脑环境要求 本机使用的编译环境为:系统为Windows 10, Microsoft Visual Studio Enterprise 2019,版本 16.11.26,cmake-3.18.6-win64-x64 这些为基本的操作环境自己可以从网上下载安装。 二. 依赖环境下载 DirectX SDK &a…

详谈Android进程间的大数据通信机制:LocalSocket

前言 说起Android进行间通信,大家第一时间会想到AIDL,但是由于Binder机制的限制,AIDL无法传输超大数据。 比如我们在之前文章《WebRtc中是如何处理视频数据的?》提到的我们可以得到WebRtc的视频数据,这时候我们如果有…

Unity3d数字化看板-多关节机器人运动控制

特殊:机器人多关节跟随运动 机械手运动控制主要是关节的旋转,通过控制多个关节的角度,实现对机械手的同步控制 机械手运动控制,可以分解为多个关节的运动,下一关节是跟随在上一关节运动,在处理模型的时候…

Know-Evolve: Deep Temporal Reasoning for Dynamic Knowledge Graphs

Know-Evolve: Deep Temporal Reasoning for Dynamic Knowledge Graphs Rakshit Trivedi 1 Hanjun Dai 1 Yichen Wang 1 Le Song 1 知识背景 Temporal Knowledge Graph : facts occur,recur or evolve over time in these graphs,and each edge in the graphs have temporal …

【 Spark编程基础 】实验3

准备工作 启动Hadoop集群 & Spark • 启动Hadoop集群start-all.sh • 启动Sparkcd /usr/local/spark/spark-2.3.3-bin-hadoop2.6/# ./sbin/start-all.sh 实验数据说明。 • 数据为1970年到2016年,每年各球队的球员比赛数据统计,数据文件的格式如图1所…

几个实用的正则表达式

1到100之间的正整数正则 表达式:^[1-9]\d?$|^100$ 解释: ^表示匹配字符串开始位置 [1-9]表示数字1-9中的任意一个 \d表示任意一个数字 ?表示前面一个字符或子表达式出现0或1次 $表示匹配字符串结束位置 |表示或 最终的解释为:匹配满…

js 各种数据类型互相转换的函数

js 各种数据类型互相转换的函数 JavaScript中的数据类型包括字符串、数字、布尔、数组、对象等,以下是它们之间互相转换的函数: 字符串转数字: parseInt()函数:把字符串转换为整数。如果字符串以非数字字符开头,则返…