@PostConstruct 和 @PreDestroy 使用

news/2024/12/6 19:14:20/

目录

    • 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…