Spring Boot 注解 @PostConstruct 介绍
Spring Boot 注解 @PostConstruct 介绍
文章目录
- Spring Boot 注解 @PostConstruct 介绍
- 一、基本介绍
- 二、@PostConstruct 的执行时机
- Spring Bean 的生命周期
- @PostConstruct 的确切执行时机
- 执行顺序示例
- 重要注意事项
- 三、使用场景及代码示例
- 1. 初始化资源:比如打开数据库连接、初始化缓存等。
- 2. 设置默认值:在对象创建后,设置一些默认属性值。
- 3. 启动定时任务:在Spring中,可以使用`@PostConstruct`来启动一个定时任务。
- 4. 执行验证:在对象创建并注入依赖后,执行一些验证逻辑。
- 四、注意事项
- 五、结论
在Spring Boot框架中,
@PostConstruct
是一个非常有用的注解,它用于在依赖注入完成后执行初始化方法。这个注解是Java EE规范的一部分,被广泛应用于企业级应用开发中。本文将介绍
@PostConstruct
的基本概念、使用场景以及提供详细的代码示例。
一、基本介绍
@PostConstruct
注解用于标注在方法上,这个方法会在依赖注入完成后自动执行。它通常用于执行一些初始化操作,比如设置一些初始值、启动定时任务、初始化数据库连接等。
使用@PostConstruct
注解的方法必须满足以下条件:
- 方法不能有参数;
- 方法返回类型必须是void;
- 方法不能抛出受检异常(checked exceptions);
- 方法可以是public、protected、package-private或者private;
- 方法可以是static,但通常不推荐使用static方法,因为静态方法无法被容器管理。
这是一个很好的问题。让我们深入探讨一下 @PostConstruct
的执行时机。
二、@PostConstruct 的执行时机
@PostConstruct
注解的方法在 Spring Bean 的生命周期中有一个特定的执行时机。为了更好地理解这一点,我们需要了解 Spring Bean 的生命周期。
Spring Bean 的生命周期
Spring Bean 的生命周期大致可以分为以下几个阶段:
- 实例化(Instantiation)
- 属性赋值(Populate Properties)
- 初始化(Initialization)
- 销毁(Destruction)
@PostConstruct
注解的方法在初始化阶段执行,更具体地说:
@PostConstruct 的确切执行时机
- 在 Bean 的构造方法执行完毕之后
- 在属性赋值完成之后
- 在 InitializingBean 的 afterPropertiesSet() 方法之前
- 在自定义的 init() 方法之前
执行顺序示例
为了更清楚地展示 @PostConstruct
的执行时机,让我们看一个包含多个生命周期回调的示例:
import org.springframework.beans.factory.InitializingBean;
import org.springframework.stereotype.Component;import javax.annotation.PostConstruct;@Component
public class LifecycleDemoBean implements InitializingBean {public LifecycleDemoBean() {System.out.println("1. Constructor");}@PostConstructpublic void postConstruct() {System.out.println("3. PostConstruct");}@Overridepublic void afterPropertiesSet() throws Exception {System.out.println("4. AfterPropertiesSet");}public void init() {System.out.println("5. Custom init method");}// Assume this method is called by Spring to set a propertypublic void setProperty(String property) {System.out.println("2. Property set: " + property);}
}
在这个例子中,输出顺序将会是:
- Constructor
- Property set: someValue
- PostConstruct
- AfterPropertiesSet
- Custom init method
重要注意事项
-
@PostConstruct
方法在依赖注入完成后立即执行,这意味着它可以使用注入的依赖。 -
如果一个类中有多个
@PostConstruct
方法,它们的执行顺序是不确定的。因此,最好只使用一个@PostConstruct
方法。 -
@PostConstruct
方法在每次创建 Bean 时只执行一次。如果 Bean 的作用域是 singleton(默认),那么在整个应用生命周期中只会执行一次。 -
如果在
@PostConstruct
方法中抛出异常,会阻止 Bean 的正常创建,可能导致应用启动失败。 -
@PostConstruct
方法可以是 private、protected 或 public,但不能是 static。
三、使用场景及代码示例
1. 初始化资源:比如打开数据库连接、初始化缓存等。
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;@Component
public class DatabaseInitializer {private Connection connection;@PostConstructpublic void initializeDatabase() {try {String url = "jdbc:mysql://localhost:3306/mydb";String user = "username";String password = "password";connection = DriverManager.getConnection(url, user, password);System.out.println("Database connection established.");} catch (SQLException e) {e.printStackTrace();}}
}
2. 设置默认值:在对象创建后,设置一些默认属性值。
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;@Component
public class ConfigurationManager {private String defaultLanguage;private int maxConnections;@PostConstructpublic void setDefaults() {defaultLanguage = "English";maxConnections = 100;System.out.println("Default values set: Language=" + defaultLanguage + ", Max Connections=" + maxConnections);}
}
3. 启动定时任务:在Spring中,可以使用@PostConstruct
来启动一个定时任务。
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;@Component
public class ScheduledTaskManager {@PostConstructpublic void initScheduledTasks() {System.out.println("Scheduled tasks initialized.");startPeriodicTask();}@Scheduled(fixedRate = 60000) // Run every minutepublic void startPeriodicTask() {System.out.println("Executing periodic task...");}
}
4. 执行验证:在对象创建并注入依赖后,执行一些验证逻辑。
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;@Component
public class UserService {@Autowiredprivate UserRepository userRepository;@PostConstructpublic void validateRepository() {if (userRepository == null) {throw new IllegalStateException("UserRepository is not initialized!");}System.out.println("UserRepository successfully validated.");}
}
四、注意事项
@PostConstruct
方法在每次创建bean时只执行一次。- 如果类中有多个
@PostConstruct
方法,它们的执行顺序是不确定的。 @PostConstruct
方法应该尽量保持简短和高效,避免执行耗时的操作。- 在
@PostConstruct
方法中抛出的异常会导致bean的创建失败。
五、结论
@PostConstruct
注解是Spring框架中一个强大而灵活的工具,它允许开发者在bean生命周期的特定时刻执行初始化逻辑。通过合理使用@PostConstruct
,可以确保在应用启动时正确初始化资源、设置默认值、启动后台任务等,从而提高应用的健壮性和可维护性。
希望本文对你理解和使用@PostConstruct
有所帮助。如果你有任何问题或建议,欢迎在评论区留言讨论。
相关文章:
Spring Boot 注解 @PostConstruct 介绍
Spring Boot 注解 PostConstruct 介绍 文章目录 Spring Boot 注解 PostConstruct 介绍一、基本介绍二、PostConstruct 的执行时机Spring Bean 的生命周期PostConstruct 的确切执行时机执行顺序示例重要注意事项 三、使用场景及代码示例1. 初始化资源:比如打开数据库…...
深度学习环境配置报错解决日记
2024年7越24日 1、detectron2需要编译 首先需要在自己创建的虚拟环境中下载一下detectron2 conda create -n pytorch python3.9 conda activate pythorch git clone https://github.com/facebookresearch/detectron2.git 接下来就是编译环节: 在win系统中&…...

百度,有道,谷歌翻译API
API翻译 百度,有道,谷歌API翻译(只针对中英相互翻译),其他语言翻译需要对应from,to的code 百度翻译 package fills.tools.translate; import java.util.ArrayList; import java.util.HashMap; import java.util.Lis…...
java-双亲委派机制
Java虚拟机(JVM)中的类加载器(Class Loader)负责将类(.class文件)加载到JVM中,以便Java程序能够使用这些类。在JVM中,类加载器被组织成一种层次结构关系,这种层次结构关系…...

【C++】set的使用
🔥个人主页: Forcible Bug Maker 🔥专栏: STL || C 目录 🌈前言🌈关于set🔥容量函数emptysize 🔥Modifiersinserteraseclear 🔥Operationsfindcountlower_bound和upper_…...
React 18【实用教程】(2024最新版)
搭建开发环境 含配置,react-developer-tools 和 Redux DevTools 下载安装 https://blog.csdn.net/weixin_41192489/article/details/138523829 JSX 语法 https://blog.csdn.net/weixin_41192489/article/details/138649165 组件 父子组件传值、兄弟组件传值、越层组…...
Perl语言入门学习指南
Perl语言(Practical Extraction and Report Language)是一种强大的脚本语言,以其灵活性和强大的文本处理能力而闻名。Perl广泛应用于系统管理、Web开发、网络编程和数据处理等领域。本文将带您入门Perl语言,介绍其基本语法、常用功…...
《Java8函数式编程》学习笔记汇总
前言 见证了java8的多层排序,为此想系统学习下java8的用法。 目录 简介Lambda表达式流高级集合类和收集器数据并行化测试、调试和重构设计和架构的原则使用Lambda表达式编写并发程序下一步改怎么办 后记...
C语言之封装,继承,多态
本文参考: c语言面向对象之封装c面向对象之继承Linux源码分析之多态 一、封装 封装的本质就是将数据和方法集中到一个对象中,c或者java使用的是class来实现。c语言中可以使用struct来实现同样的功能。比如下面的程序: struct student {int…...

GO内存分配详解
文章目录 GO内存分配详解一. 物理内存(Physical Memory)和虚拟内存(Virtual Memory)二. 内存分配器三. TCMalloc线程内存(thread memory)页堆(page heap)四. Go内存分配器mspanmcachemcentralmheap五. 对象分配流程六. Go虚拟内存ArenaGO内存分配详解 这篇文章中我将抽丝剥茧,…...

每日Attention学习12——Exterior Contextual-Relation Module
模块出处 [ISBI 22] [link] [code] Duplex Contextual Relation Network for Polyp Segmentation 模块名称 Exterior Contextual-Relation Module (ECRM) 模块作用 内存型特征增强模块 模块结构 模块思想 原文表述:在临床环境中,不同样本之间存在息肉…...

为什么现在电销公司这么难?
现在电销公司普遍底薪就4000,员工要干的工作: 1、自己办卡、现在大部分人对隐私方面比较在意,一般电销公司还都需要自己身份证实名办卡,打几天又封号,有的人甚至被移动拉黑 2、天天打电话,遇见的什么人都…...
每天一个数据分析题(四百四十二)- 标签与指标
数据分析师在工作中常常会涉及两个概念:标签、指标,下面关于标签与指标的描述正确的是()? A. 指标通常可以量化,但是标签一般是不可量化的 B. 标签是用来定义、评价和描述特定事物的一种标准或方式 C. 指…...
[论文笔记] pai-megatron-patch Qwen2-72B/7B/1.5B 长文本探路
[论文笔记] Pai-megatron-patch cpu-offload 改到 Qwen2-CSDN博客 Pai-Megatron-Patch (mcore代码) 长文本限制: 开SP之后,72B能开到16K,7B能开到32K。 但是72B开16K,或者7B开32K时,如果训练时训练样本中有长文本的话,则还是会OOM。 code: 相对于原repo加了一些代…...

【SpringCloud】微服务远程调用OpenFeign
工作原理流程图 上代码 common中添加依赖: <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> <dependency><groupId>org.spri…...

MySQL零散拾遗(四)
聚合函数 聚合函数作用于一组数据,并对一组数据返回一个值。 常见的聚合函数:SUM()、MAX()、MIN()、AVG()、COUNT() 对COUNT()聚合函数的更深一层理解 COUNT函数的作用:计算指定字段在查询结果中出现的个数(不包含NULL值&#…...

大语言模型-检索测评指标
1. MRR (Mean Reciprocal Rank)平均倒数排名: 衡量检索结果排序质量的指标。 计算方式: 对于每个查询,计算被正确检索的文档的最高排名的倒数的平均值,再对所有查询的平均值取均值。 意义: 衡量…...
Zookeeper集群中节点之间数据是如何同步的
1.首先集群启动时,会先进行领导者选举,确定哪个节点是Leader,哪些节点是Follower和Observer 2.然后Leader会和其他节点进行数据同步,采用发送快照和发送Diff日志的方式 3.集群在工作过程中,所有的写请求都会交给Lead…...

HTTPServer改进思路2(mudou库核心思想融入)
mudou网络库思想理解 Reactor与多线程 服务器构建过程中,不仅仅使用一个Reactor,而是使用多个Reactor,每个Reactor执行自己专属的任务,从而提高响应效率。 首先Reactor是一种事件驱动处理模式,其主要通过IO多路复用…...
Kubernetes Secret 详解
Kubernetes Secret 是一种用于存储和管理敏感信息的对象,如密码、OAuth 令牌和 SSH 密钥等。使用 Secret 可以避免将机密数据直接放在 Pod 规约或容器镜像中,从而增加了应用程序的安全性。 Secret 的类型 Kubernetes 支持多种类型的 Secret,包括: Opaque:默认的…...

如何在看板中有效管理突发紧急任务
在看板中有效管理突发紧急任务需要:设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP(Work-in-Progress)弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中,设立专门的紧急任务通道尤为重要,这能…...
大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计
随着大语言模型(LLM)参数规模的增长,推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长,而KV缓存的内存消耗可能高达数十GB(例如Llama2-7B处理100K token时需50GB内存&a…...

C# 表达式和运算符(求值顺序)
求值顺序 表达式可以由许多嵌套的子表达式构成。子表达式的求值顺序可以使表达式的最终值发生 变化。 例如,已知表达式3*52,依照子表达式的求值顺序,有两种可能的结果,如图9-3所示。 如果乘法先执行,结果是17。如果5…...

逻辑回归暴力训练预测金融欺诈
简述 「使用逻辑回归暴力预测金融欺诈,并不断增加特征维度持续测试」的做法,体现了一种逐步建模与迭代验证的实验思路,在金融欺诈检测中非常有价值,本文作为一篇回顾性记录了早年间公司给某行做反欺诈预测用到的技术和思路。百度…...
为什么要创建 Vue 实例
核心原因:Vue 需要一个「控制中心」来驱动整个应用 你可以把 Vue 实例想象成你应用的**「大脑」或「引擎」。它负责协调模板、数据、逻辑和行为,将它们变成一个活的、可交互的应用**。没有这个实例,你的代码只是一堆静态的 HTML、JavaScript 变量和函数,无法「活」起来。 …...
Leetcode33( 搜索旋转排序数组)
题目表述 整数数组 nums 按升序排列,数组中的值 互不相同 。 在传递给函数之前,nums 在预先未知的某个下标 k(0 < k < nums.length)上进行了 旋转,使数组变为 [nums[k], nums[k1], …, nums[n-1], nums[0], nu…...
区块链技术概述
区块链技术是一种去中心化、分布式账本技术,通过密码学、共识机制和智能合约等核心组件,实现数据不可篡改、透明可追溯的系统。 一、核心技术 1. 去中心化 特点:数据存储在网络中的多个节点(计算机),而非…...

五子棋测试用例
一.项目背景 1.1 项目简介 传统棋类文化的推广 五子棋是一种古老的棋类游戏,有着深厚的文化底蕴。通过将五子棋制作成网页游戏,可以让更多的人了解和接触到这一传统棋类文化。无论是国内还是国外的玩家,都可以通过网页五子棋感受到东方棋类…...

【免费数据】2005-2019年我国272个地级市的旅游竞争力多指标数据(33个指标)
旅游业是一个城市的重要产业构成。旅游竞争力是一个城市竞争力的重要构成部分。一个城市的旅游竞争力反映了其在旅游市场竞争中的比较优势。 今日我们分享的是2005-2019年我国272个地级市的旅游竞争力多指标数据!该数据集源自2025年4月发表于《地理学报》的论文成果…...

goreplay
1.github地址 https://github.com/buger/goreplay 2.简单介绍 GoReplay 是一个开源的网络监控工具,可以记录用户的实时流量并将其用于镜像、负载测试、监控和详细分析。 3.出现背景 随着应用程序的增长,测试它所需的工作量也会呈指数级增长。GoRepl…...