【spring】@PostConstruct和@PreDestroy注解学习

news2024/11/28 9:37:43

@PostConstruct和@PreDestroy介绍

@PostConstruct@PreDestroy是Java EE(Enterprise Edition)和Java SE(Standard Edition)中的注解,它们用于指定一个bean在其生命周期的特定点应该执行的方法。

这两个注解是JSR250规范中提供的注解。

  1. @PostConstruct

    • 这个注解用于标记一个方法,该方法将在依赖注入完成后立即执行。

    • 它通常用于执行对象的初始化操作,比如设置默认值、连接数据库、打开文件等。

    • 这个注解可以应用于任何方法,但通常建议只应用于无参数的方法。

    • 当一个类被实例化并注入依赖后,容器会自动调用标记有 @PostConstruct 的方法。

  2. @PreDestroy

    • 这个注解用于标记一个方法,该方法将在对象被销毁之前执行。

    • 它通常用于执行清理操作,比如关闭数据库连接、释放资源等。

    • 与 @PostConstruct 类似,@PreDestroy 也可以应用于任何方法,但通常建议只应用于无参数的方法。

    • 当容器决定销毁一个对象时,它会自动调用标记有 @PreDestroy 的方法。

@PostConstruct和@PreDestroy源码

@Documented
@Retention (RUNTIME)
@Target(METHOD)
public @interface PostConstruct {

}
@Documented
@Retention (RUNTIME)
@Target(METHOD)
public @interface PreDestroy {
}
源代码截图

@PostConstruct和@PreDestroy属性介绍

无属性。哈哈~~~

@PostConstruct和@PreDestroy注解使用场景

  1. 资源初始化和配置:

    • 在对象创建后,可能需要初始化一些资源,如数据库连接、网络连接、文件句柄等。@PostConstruct 注解可以用来确保这些资源在对象准备好使用之前被正确地初始化。

  2. 依赖注入后的设置:

    • 在依赖注入完成后,可能需要对注入的依赖进行一些额外的设置或验证。@PostConstruct 注解可以用来执行这些操作。

  3. 对象销毁前的清理:

    • 当对象不再需要时,可能需要执行一些清理操作,如关闭数据库连接、释放内存、清理临时文件等。@PreDestroy 注解可以用来确保这些清理操作在对象被销毁之前执行。

  4. 状态保存:

    • 在对象销毁之前,可能需要保存对象的状态,以便在下次启动时恢复。@PreDestroy 注解可以用来执行这些保存操作。

  5. 日志记录:

    • 在对象创建和销毁时,可能需要记录日志,以便跟踪对象的生命周期。@PostConstruct 和 @PreDestroy 注解可以用来记录这些事件。

  6. 事务管理:

    • 在某些情况下,可能需要在对象创建后立即开始一个事务,或者在对象销毁前提交或回滚事务。@PostConstruct 和 @PreDestroy 注解可以用来管理这些事务。

  7. 安全性和权限检查:

    • 在对象创建后,可能需要执行安全性和权限检查,以确保对象只能被授权的用户访问。@PostConstruct 注解可以用来执行这些检查。

  8. 依赖检查:

    • 在对象创建后,可能需要检查依赖是否存在或是否满足特定的条件。@PostConstruct 注解可以用来执行这些检查。

  9. 性能优化:

    • 在对象创建后,可能需要进行一些性能优化,如缓存配置、调整线程池大小等。@PostConstruct 注解可以用来执行这些优化。

  10. 测试和验证:

    • 在对象创建后,可能需要进行一些测试和验证,以确保对象的正确性。@PostConstruct 注解可以用来执行这些测试。

@PostConstruct和@PreDestroy测试示例代码

示例代码 一
maven的pom文件增加
      <dependency>
            <groupId>jakarta.annotation</groupId>
            <artifactId>jakarta.annotation-api</artifactId>
            <version>2.1.1</version>
        </dependency>
PrePostDemo类
package com.yang.SpringTest.annotation.preposLearn;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

/**
 * <p>PrePostDemo类</p>
 *
 * @author By: chengxuyuanshitang
 * Package com.yang.SpringTest.annotation.preposLearn
 * Ceate Time 2024-04-11 15:24
 */
public class PrePostDemo {
    public PrePostDemo() {
        System.out.println("****** PrePostDemo constructor ...");
    }

    public void initMethod() {
        System.out.println("****** PrePostDemo init ...");
    }
    public void destroyMethod() {
        System.out.println("****** PrePostDemo destroy ...");
    }
    @PostConstruct
    public void postConstruct(){
        System.out.println("****** PrePostDemo postConstruct ...");
    }
    @PreDestroy
    public void preDestroy(){
        System.out.println("****** PrePostDemo preDestroy ...");
    }
}

PrePostDemoConfig配置类
package com.yang.SpringTest.annotation.preposLearn;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * <p>PrePostDemoConfig配置类</p>
 *
 * @author By: chengxuyuanshitang
 * Package com.yang.SpringTest.annotation.preposLearn
 * Ceate Time 2024-04-11 15:25
 */
@Configuration
public class PrePostDemoConfig {

    @Bean(initMethod = "initMethod", destroyMethod = "destroyMethod")
    public PrePostDemo prePostDemo(){
        return new PrePostDemo();
    }

}

PrePostDemoTest测试类
package com.yang.SpringTest.annotation.preposLearn;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

/**
 * <p>PrePostDemoTest测试类</p>
 *
 * @author By: chengxuyuanshitang
 * Package com.yang.SpringTest.annotation.preposLearn
 * Ceate Time 2024-04-11 15:25
 */
public class PrePostDemoTest {

    public static void main(String[] args) {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(PrePostDemoConfig.class);
        context.close();
    }
}

运行结果




本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1587022.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【高端电流检测IC储能产品应用方案】耐压28V侧轨的电流检测芯片FP130A 应用于电脑电源,开关电源以及多口快充充电器,户外移动电源,适配器,电池充电器等

电流检测技术常用于高压短路保护、电机控制、DC/DC换流器、系统功耗管理、二次电池的电流管理、蓄电池管理等电流侦测等场景。对于大多数应用而言&#xff0c;都是间接测量电阻两端的跨压差来获取待测电流。 如下面的高端电流检测芯片FP130A&#xff0c;丝印是FC915。电路原理图…

MySQL 全文检索

不是所有的数据表都支持全文检索 MySQL支持多种底层数据库引擎&#xff0c;但是并非所有的引擎支持全文检索 &#xff0c;目前最常用引擎是是MyISAM和InnoDB&#xff1b;前者支持全文检索&#xff0c;后者不支持。 booolean模式操作符 操作符含义必须有-必须不包含>包含对应…

Unity 中画线

前言&#xff1a; 在Unity项目中&#xff0c;调试和可视化是开发过程中不可或缺的部分。其中&#xff0c;绘制线条是一种常见的手段&#xff0c;可以用于在Scene场景和Game视图中进行调试和展示。本篇博客将为你介绍多种不同的绘制线条方法&#xff0c;帮助你轻松应对各种调试…

rust使用print控制台打印输出五颜六色的彩色红色字体

想要在控制台打印输出彩色的字体&#xff0c;可以使用一些已经封装好的依赖库&#xff0c;比如ansi_term这个依赖库&#xff0c;官方依赖库地址&#xff1a;https://crates.io/crates/ansi_term 安装依赖&#xff1a; cargo add ansi_term 或者在Cargo.toml文件中加入&#…

HWOD:在含有空格的字符串中统计大写字母的个数

一、知识点 回车键的ASCII码是10 二、题目 1、描述 找出给定字符串中大写字符(即A-Z)的个数。 数据范围&#xff1a;字符串长度&#xff1a;1≤∣s∣≤250 字符串中可能包含空格或其他字符 2、输入 对于每组样例&#xff0c;输入一行&#xff0c;代表待统计的字符串 …

DCDC 5V2A电源升压芯片FP6276BXR-G1 FP6298XR-G1

一、FP6276BXR-G1 3.7v升5V2A同步升压输入电压:2.4V-4.5V FP6276B是一个具有PWM/PSM控制的电流模式增压直流-直流转换器。它的PWM电路内置40mΩ高侧开关和40mΩ低侧开关使该调节器高高效。内部补偿网络还将外部组件计数最小化到只有6个。一个内部的0.6V电压被连接到误差放大器…

玩机进阶教程------手机定制机 定制系统 解除系统安装软件限制的一些步骤解析

定制机 在于各工作室与商家合作定制rom中有一些定制机。限制用户私自安装第三方软件。或者限制解锁 。无法如正常机登陆账号等等。定制机一般用于固定行业或者一些部门。专机专用。例如很多巴枪扫描机型等等。或者一些小牌机型。对于没有官方包的机型首先要导出各个分区来制作…

Java快速入门系列-8(Web开发基础)

第8章 Web开发基础 8.1 Servlet与JSP8.1.1 Servlet简介8.1.2 JSP简介与使用8.1.3 Servlet与JSP协作8.2 Web服务器与Tomcat8.2.1 安装与配置Tomcat8.2.2 配置与管理Web应用8.3 MVC设计模式与Java Web应用8.3.1 MVC原理8.3.2 MVC在Java Web中的应用8.4 RESTful API设计与实现8.4.…

学习R语言第二天

R语言可以做什么 1.数据分析 R语言如何使用 1. 请看我的操作方式 2. 如何获取当前路径 -- 获取当前路径 > getwd() [1] "E:/R/RWorkSpace/day01" -- 修改当前路径 > setwd(dir "E:/R") > getwd() [1] "E:/R" 3.查看当下数据值的信…

计算机毕业设计 工厂车间设备管理系统php+vue.js

该系统是以PHP为主要开发语言&#xff0c;集合MySQL数据库技术构建基于Web的以信息为目标的&#xff0c;动态的交互平台 PHP与Apache&#xff0c;MySQL的组合虽然有着诸多优势&#xff0c;但三种出自不同作者的开源软件要能很好的配合工作&#xff0c;需要很多手工配置&#x…

源码解析HashMap的put方法

前言 HashMap 基于哈希表的 Map 接口实现&#xff0c;其中的值是以 key-value 存储形式存在&#xff0c;即主要用来存放键值对。它的 key、value 都可以为 null&#xff0c;此外&#xff0c;HashMap 中的映射不是有序的。那么本篇文章将从源码的角度来很详细地讲解HashMap中pu…

5G智慧水利数字孪生可视化平台,推进水利行业数字化转型

5G智慧水利数字孪生可视化平台&#xff0c;推进水利行业数字化转型。随着5G技术的快速发展&#xff0c;越来越多的行业开始探索数字化转型的道路。水利行业作为国民经济的重要支柱&#xff0c;也面临着数字化转型的迫切需求。5G智慧水利数字孪生可视化平台作为水利行业数字化转…

微服务-7 Docker

一、镜像、容器、仓库 容器是镜像的实例&#xff0c;仓库中存储着镜像。 二、镜像的操作 三、容器的操作 创建容器停止容器&#xff0c;查看后发现没有了(docker ps 默认只展示没有停止的) docker ps -a (可以展示运行中和停止的镜像)删除容器&#xff1a;(docker rm 不能删除…

LangChain-18 Caching 将回答内容进行缓存 可在内存中或数据库中持久化缓存

背景描述 可以将问答的内容缓存起来&#xff0c;如果是相同的问题&#xff0c;那么将会直接把答案返回去&#xff0c;可以节约费用和计算。 安装依赖 pip install -qU langchain-core langchain-openai编写代码 我们可以通过 InMemoryCache 进行内存缓存 或者 SQLiteCache …

【C++题解】1605. 求一个两位数的个位和十位的和

问题&#xff1a;1605. 求一个两位数的个位和十位的和 类型&#xff1a;基本运算、拆位求解。 题目描述&#xff1a; 从键盘读入一个两位的整数 n &#xff0c;请求出这个两位整数个位和十位的和是多少&#xff1f; 输入&#xff1a; 一个两位的整数 n 。 输出&#xff1a…

R语言ggplot2绘图学习笔记(基础知识大全)

R语言ggplot2绘图入门笔记 今天分享的内容是在R语言中利用ggplot2进行可视化的入门笔记&#xff0c;适用于初学者了解ggplot2绘图系统。干货满满&#xff0c;建议收藏&#xff01; 首先安装以下R包&#xff1a; install.packages(c("tidyverse", "colorspace&qu…

机器学习-09-图像处理01-理论

总结 本系列是机器学习课程的系列课程&#xff0c;主要介绍机器学习中图像处理技术。 参考 02图像知识 色彩基础知识整理-色相、饱和度、明度、色调 图像特征提取&#xff08;VGG和Resnet特征提取卷积过程详解&#xff09; Python图像处理入门 【人工智能】PythonOpenCV…

PostgreSQL强势崛起,选择它还是MySQL

大家好&#xff0c;关系型数据库&#xff08;RDBMS&#xff09;作为数据管理的基石&#xff0c;自数据仓库兴起之初便扮演着核心角色&#xff0c;并在数据科学的发展浪潮中持续发挥着价值。即便在人工智能和大型语言模型&#xff08;LLM&#xff09;日益成熟的今天&#xff0c;…

【方法】PDF密码如何取消?

对于重要的PDF文件&#xff0c;很多人会设置密码保护&#xff0c;那后续不需要保护了&#xff0c;如何取消密码呢&#xff1f; 今天我们来看看&#xff0c;PDF的两种密码&#xff0c;即“限制密码”和“打开密码”&#xff0c;是如何取消的&#xff0c;以及忘记密码的情况要怎…

2024考研调剂须知

----------------------------------------------------------------------------------------------------- 考研复试科研背景提升班 教你快速深入了解掌握考研复试面试中的常见问题以及注意事项&#xff0c;系统的教你如何在短期内快速提升自己的专业知识水平和编程以及英语…