@PostConstruct 和 @PreDestroy 使用

news/2024/4/15 7:52:53

目录

    • 1.简介
    • 2.使用
    • 3.注意事项
    • 4.执行顺序
    • 5.测试
    • 6.测试结果

1.简介

@PostConstruct: Java 自带的注解,在方法上使用该注解,会在项目启动的时候执行被修饰的方法。

@PreDestroy: Java 自带的注解,在方法上使用该注解,会在项目停止的时候执行被修饰的方法。

Java EE5 开始,@PostConstruct 和 @PreDestroy 被增加用来影响 Servlet 的生命周期,这两个注解用来修饰一个非静态的 void() 方法。

2.使用

用法1:

@PostConstruct
public void someMethod(){}

用法2:

public @PostConstruct void someMethod(){}

3.注意事项

  1. 注解修饰的方法,不能有入参。
    否则抛出异常:Lifecycle method annotation requires a no-arg method
  2. 注解所在类必须保证会注入,一般用@Component注解修饰,否则不生效。
  3. 注解修饰的方法,返回值是 void。
    只是建议,实际上是可以有返回值,springboot启动没有报错,但@PostConstruct 一般仅用于初始化bean、预加载常规数据用,所以一般不需要返回值。

4.执行顺序

  • 从依赖注入(DI)的概念我们知道,要将一个对象注入到另一个对象中,那么首先必须得生成这两个对象的实例。所以,当类 a 中有一个对象 p 的成员变量被 @Autowired 注解修饰,那么 @Autowired 注入对象 p 是在对象 a 的构造方法执行完毕之后进行的。
  • 如果想在生成对象时完成某些初始化操作,而偏偏这些初始化操作又依赖于依赖注入,那么就无法在构造函数中实现。此时可以使用 @PostConstruct 注解修饰一个方法来完成初始化,@PostConstruct 注解会让方法在依赖注入完成后被自动调用。

5.测试

AnnotationTest.java

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.stereotype.Component;import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;/*** <p> @Title AnnotationTest* <p> @Description Bean记载测试类** @author ACGkaka* @date 2023/1/5 10:45*/
@Slf4j
@Component
public class AnnotationTest implements InitializingBean, DisposableBean {@PostConstructpublic void postConstruct() {log.info("PPPPPostConstruct........");}@PreDestroypublic void preDestroy() throws InterruptedException {log.info("PPPPPreDestroy.......");}@Overridepublic void afterPropertiesSet() throws Exception {log.info("IIIIIInitializingBean........");}@Overridepublic void destroy() throws Exception {log.info("DDDDDisposable.......");}
}

6.测试结果

项目启动日志:

在这里插入图片描述

项目停止日志:

在这里插入图片描述

测试结果证实如下顺序:

  • @PostConstruct -> InitializingBean
  • @PreDestroy -> DisposableBean

整理完毕,完结撒花~





参考地址:

1.@PostConstruct详解,https://blog.csdn.net/sunayn/article/details/92840439

2.java:@PostConstruct注解使用,https://blog.csdn.net/a232884c/article/details/122683275


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

相关文章

Kotlin协程:启动模式

启动模式 前言1、使用启动模式2、启动模式概况挂起点调度和执行3、模式 CoroutineStart.DEFAULT4、模式 CoroutineStart.ATOMIC5、模式 CoroutineStart.LAZY6、模式 CoroutineStart.UNDISPATCHED前言 我们看launch、async 构造函数需要传入一个协程上下文、协程启动模式、协程…

【数据结构】(牛客)链表的回文结构,LeetCode相交链表,LeetCode环形链表

目录 一、链表的回文结构 1、题目说明 2、题目解析 二、相交链表 1、题目说明 2、题目解析 三、环形链表 1、题目说明 2、题目解析 一、链表的回文结构 1、题目说明 题目链接&#xff1a;链表的回文结构 对于一个链表&#xff0c;请设计一个时间复杂度为O(n),额外空间复杂度…

可以同时解析多个binlog吗

GreatSQL社区原创内容未经授权不得随意使用&#xff0c;转载请联系小编并注明来源。GreatSQL是MySQL的国产分支版本&#xff0c;使用上与MySQL一致。作者&#xff1a; 叶金荣文章来源&#xff1a;GreatSQL社区原创 1.可以同时解析多个binlog吗 2.innodb_buffer_pool_instances设…

SpringBoot 内置工具类

SpringBoot 内置工具类 断言对象、数组、集合ObjectUtilsStringUtilsCollectionUtils文件、资源、IO 流FileCopyUtilsResourceUtilsStreamUtils反射、AOPReflectionUtilsAopUtilsAopContext断言 断言是一个逻辑判断,用于检查不应该发生的情况 Assert 关键字在 JDK1.4 中引入,…

SpringBoot项目从18.18M瘦身到0.18M

一、前言 SpringBoot部署起来虽然简单&#xff0c;如果服务器部署在公司内网&#xff0c;速度还行&#xff0c;但是如果部署在公网&#xff08;阿里云等云服务器上&#xff09;&#xff0c;部署起来实在头疼&#xff1a;编译出来的 Jar 包很大&#xff0c;如果工程引入了许多开…

【自学Java】Java语言数组遍历

Java语言数组遍历 Java语言数组遍历教程 Java 语言 中如果我们定义好了数组&#xff0c;并且给数组设置了值&#xff0c;那么怎么样访问数组呢&#xff1f;怎么样获取数组里面的数据值呢&#xff1f;我们可以使用 for 来遍历数组&#xff0c;获取每个位置上的值。 Java语言数…

uniCloud云开发----6、uniapp配置tabbar底部导航栏和去掉uni-app顶部标题

uniapp配置tabbar底部导航栏、去掉uni-app顶部标题前言效果图1、创建页面并声明注册2、配置pages.json--tabBar3、通过pages.json来去掉uni-app顶部标题全部页面都去掉单个页面去掉前言 tabbar文档 在 pages.json 中提供 tabBar 配置&#xff0c;不仅仅是为了方便快速开发导航…

Css布局

正常流远离&#xff1a;在 CSS 标准中&#xff0c;规定了如何排布每一个文字或者盒的算法&#xff0c;这个算法依赖一个排版的“当前状态”&#xff0c;CSS 把这个当前状态称为“格式化上下文&#xff08;formatting context&#xff09;”。 格式化上下文 盒 / 文字 位置 fo…

一直没明白的 HTTPS,今天必须让你懂了~

大家第一次接触 HTTPS 协议的时候是不是和我一样&#xff0c;非常困惑。 这玩意概念又多又繁琐。尤其是里面的公钥私钥啥的。 当时就特别想知道&#xff0c;为什么用公钥加密却不能用公钥解密&#xff1f; 看完这篇文章你会弄明白&#xff0c;同时还会解锁很多HTTPS里的细节…

sqlServer如何实现分页查询

一、利用max&#xff08;主键&#xff09; 公式&#xff1a; -- 分页查询公式-利用max&#xff08;主键&#xff09; select top pageSize * from 表名 where 主键> (select max(主键) from ( select top ((pageIndex-1)*pageSize1) 主键 from 表名 order by 主键 …

JWT实现登陆认证及Token自动续期

认证流程基于session的认证流程用户在浏览器中输入用户名和密码&#xff0c;服务器通过密码校验后生成一个session并保存到数据库服务器为用户生成一个sessionId&#xff0c;并将具有sesssionId的cookie放置在用户浏览器中&#xff0c;在后续的请求中都将带有这个cookie信息进行…

【YOLOv7/YOLOv5系列改进NO.51】融入多分支空洞卷积结构RFB-Bottleneck改进PANet构成新特征融合网络

文章目录前言一、解决问题二、基本原理三、​添加方法四、总结前言 作为当前先进的深度学习目标检测算法YOLOv7&#xff0c;已经集合了大量的trick&#xff0c;但是还是有提高和改进的空间&#xff0c;针对具体应用场景下的检测难点&#xff0c;可以不同的改进方法。此后的系列…

在 React 中使用 i18next

1. 安装依赖 npm i i18next react-i18next i18next-browser-languagedetectori18next 提供了翻译的基本能力。react-i18next 是 i18next 的一个插件&#xff0c;用来降低 react 的使用成本。i18next-browser-languagedetector 是用来检测浏览器语言的插件。 2. 在src下创建i18…

【Linux】进程间通信(万字详解) —— 上篇

&#x1f387;Linux&#xff1a; 博客主页&#xff1a;一起去看日落吗分享博主的在Linux中学习到的知识和遇到的问题博主的能力有限&#xff0c;出现错误希望大家不吝赐教分享给大家一句我很喜欢的话&#xff1a; 看似不起波澜的日复一日&#xff0c;一定会在某一天让你看见坚持…

Usaco Training 刷怪旅 第三层 第六题:Ski Course Design

说实话&#xff0c;一开始看上一题的时候觉得太恶心就先来做这道&#xff0c;所以这题其实比上一题早做出来&#xff08;&#xff09; Farmer John has N hills on his farm (1 < N < 1,000), each with an integer elevation in the range 0 .. 100. In the winter, sin…

Java--面向对象经典练习题

文章内容 一、文字版格斗游戏 二、对象数组1 三、对象数组2 四、对象数组3 五、对象数组4 题目代码如下&#xff1a; 文字版格斗游戏 格斗游戏&#xff0c;每个游戏角色的姓名&#xff0c;血量&#xff0c;都不相同&#xff0c;再选定人物的时候(new对象的时候)&#xf…

水果 (map嵌套)

夏天来了~~好开心啊,呵呵,好多好多水果~~ Joe经营着一个不大的水果店.他认为生存之道就是经营最受顾客欢迎的水果.现在他想要一份水果销售情况的明细表,这样Joe就可以很容易掌握所有水果的销售情况了. Input 第一行正整数N(0<N<10)表示有N组测试数据. 每组测试数据的第…

【每日一题】【LeetCode】【第四天】移除元素

移除元素的解决之路 这个。。超级简单 题干描述 测试案例&#xff08;部分&#xff09; 第一次 根据题目描述&#xff0c;自己能想到的就是如果val这个数&#xff0c;一直存在在nums列表中&#xff0c;那就一直删除等于val的元素。 因为remove(val)一次只能删除一个元素&am…

MyBatis【多表查询与动态SQL使用】

MyBatis【多表查询与动态SQL使用】&#x1f34e;一.MyBatis多表查询&#x1f352;1.1 一对一查询&#x1f352;1.2 一对多查询&#x1f34e;二.动态SQL使用&#x1f352;2.1 if 标签使用&#x1f352;2.2 trim 标签使用&#x1f352;2.3 where 标签使用&#x1f352;2.4 set 标…

npm与包

1、包 1.1、什么是包 Node.js 中的第三方模块又叫做包。就像电脑和计算机指的是相同的东西&#xff0c;第三方模块和包指的是同一个概念&#xff0c;只不过叫法不同。 1.2、包的来源 不同于 Node.js 中的内置模块与自定义模块&#xff0c;包是由第三方个人或团队开发出来的&a…
最新文章