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注解的方法必须满足以下条件:

  1. 方法不能有参数;
  2. 方法返回类型必须是void;
  3. 方法不能抛出受检异常(checked exceptions);
  4. 方法可以是public、protected、package-private或者private;
  5. 方法可以是static,但通常不推荐使用static方法,因为静态方法无法被容器管理。

这是一个很好的问题。让我们深入探讨一下 @PostConstruct 的执行时机。

二、@PostConstruct 的执行时机

@PostConstruct 注解的方法在 Spring Bean 的生命周期中有一个特定的执行时机。为了更好地理解这一点,我们需要了解 Spring Bean 的生命周期。

Spring Bean 的生命周期

Spring Bean 的生命周期大致可以分为以下几个阶段:

  1. 实例化(Instantiation)
  2. 属性赋值(Populate Properties)
  3. 初始化(Initialization)
  4. 销毁(Destruction)

@PostConstruct 注解的方法在初始化阶段执行,更具体地说:

@PostConstruct 的确切执行时机

  1. 在 Bean 的构造方法执行完毕之后
  2. 在属性赋值完成之后
  3. 在 InitializingBean 的 afterPropertiesSet() 方法之前
  4. 在自定义的 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);}
}

在这个例子中,输出顺序将会是:

  1. Constructor
  2. Property set: someValue
  3. PostConstruct
  4. AfterPropertiesSet
  5. Custom init method

重要注意事项

  1. @PostConstruct 方法在依赖注入完成后立即执行,这意味着它可以使用注入的依赖。

  2. 如果一个类中有多个 @PostConstruct 方法,它们的执行顺序是不确定的。因此,最好只使用一个 @PostConstruct 方法。

  3. @PostConstruct 方法在每次创建 Bean 时只执行一次。如果 Bean 的作用域是 singleton(默认),那么在整个应用生命周期中只会执行一次。

  4. 如果在 @PostConstruct 方法中抛出异常,会阻止 Bean 的正常创建,可能导致应用启动失败。

  5. @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.");}
}

四、注意事项

  1. @PostConstruct方法在每次创建bean时只执行一次。
  2. 如果类中有多个@PostConstruct方法,它们的执行顺序是不确定的。
  3. @PostConstruct方法应该尽量保持简短和高效,避免执行耗时的操作。
  4. @PostConstruct方法中抛出的异常会导致bean的创建失败。

五、结论

@PostConstruct注解是Spring框架中一个强大而灵活的工具,它允许开发者在bean生命周期的特定时刻执行初始化逻辑。通过合理使用@PostConstruct,可以确保在应用启动时正确初始化资源、设置默认值、启动后台任务等,从而提高应用的健壮性和可维护性。

希望本文对你理解和使用@PostConstruct有所帮助。如果你有任何问题或建议,欢迎在评论区留言讨论。

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

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

相关文章

基于opencv的图片加水印实现方案

加水印应该是个很常见的需求,但是网上找的代码,都感觉不太完善。记录下自己搞出来的一个方案 水印有几个需求: 中文文字水印文字倾斜满图都是,而不是只有一个地方水印文字所在之处完全展示水印 实现思路 准备水印图 我是这么…

k8s一些名词解释

潮汐计算 是一种根据负载变化动态调整资源分配的计算模式。其核心思想是利用峰值和非峰值时段的资源需求差异,动态地扩展或缩减计算资源。在 Kubernetes 环境中,可以通过自动扩展(auto-scaling)机制,根据工作负载的变化自动调整计算资源,最大化资源利用率并减少不必要的…

QT-RTSP相机监控视频流

QT-RTSP相机监控视频流 一、演示效果二、关键程序三、下载链接 一、演示效果 二、关键程序 #include "mainwindow.h"#include <QDebug>MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), m_settings("outSmart", "LiveWatcher&…

清华大学学报哲学社会科学版

《清华大学学报》&#xff08;哲学社会科学版&#xff09;投稿须知 一、本刊简介 《清华大学学报》&#xff08;哲学社会科学版&#xff09;由清华大学主办&#xff0c;是首批国家社会科学基金资助期刊、全国中文核心期刊、中国人文社会科学核心期刊、中文社会科学引文索引&…

Gmsh教程

13、在没有底层CAD模型的情况下重新擦除STL文件 import gmsh # 导入Gmsh库&#xff0c;用于几何建模和网格划分 import math # 导入数学库&#xff0c;用于计算 import os # 导入操作系统库&#xff0c;用于处理文件路径 import sys # 导入系统库&#xff0c;用于…

CentOS 7 安装MySQL 5.7.30

CentOS 7 安装MySQL卸载&#xff08;离线安装&#xff09; 安装配置MySQL之前先查询是否存在&#xff0c;如存在先卸载再安装 rpm -qa|grep -i mysql rpm -qa|grep -i mariadb rpm -e --nodeps mariadb-libs-5.5.68-1.el7.x86_64如下命令找到直接 rm -rf 删除&#xff08;删除…

07. Hibernate 会话工厂(SessionFactory)

1. 前言 Hibernate 的核心价值观是&#xff1a;开发者们&#xff01;做你们应该做的。脏的、累的、没技术含义的由本尊来做。 本节课和大家一起好好的聊聊 Hibernate 的核心组件之一&#xff1a;会话工厂&#xff08;SessionFactory&#xff09;。 通过本节课&#xff0c;你…

Redis数据结构--跳跃表 Skip List

跳跃表&#xff08;Skip List&#xff09;是一种高效的随机化数据结构&#xff0c;通过引入多层索引来实现快速的查找、插入和删除操作。它在Redis中被用来实现有序集合&#xff08;Sorted Set&#xff09;&#xff0c;在处理大量数据时表现出了优越的性能和灵活性。本文将详细…

MySQL增量备份

增备1 做增量备份前&#xff0c;是需要进行一次完成备份的 1、做数据修改 创建一个add1.t1 t1 包含&#xff1a;id,name 加2条数据 id | name | ---------- | 1 | add1 | | 2 | add2 | ----------操作如下&#xff1a; MySQL root(none):(none)> show databases; -…

Linux openEuler_24.03部署MySQL_8.4.0 LTS安装实测验证安装以及测试连接全过程实操手册

Linux openEuler_24.03部署MySQL_8.4.0 LTS安装实测验证安装以及测试连接全过程实操手册 前言: 什么是 MySQL? MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于Oracle 公司。MySQL 是一种关系型数据库管理系统,关系型数据库将数据保存在不同的表中,…

深入探讨SQL Server端口设置:理论与实践

引言 在现代企业级应用中&#xff0c;SQL Server作为微软的旗舰数据库产品&#xff0c;广泛应用于各种关键业务系统中。设置SQL Server的端口是数据库管理中的一个重要环节&#xff0c;它不仅影响到数据库的安全性&#xff0c;还直接关系到网络通信的效率和稳定性。本文将从计…

C++ 入门基础:开启编程之旅

文章目录 引言一、C的第⼀个程序二、命名空间1、namespace2、namespace的定义 三、C输入 与 输出四、缺省参数五、函数重载六、引用1、引用的概念和定义2、引用的特性3、指针和引用的关系七、inline八、nullptr 引言 C 是一种高效、灵活且功能强大的编程语言&#xff0c;广泛应…

C1W4.Assignment.Naive Machine Translation and LSH

理论课&#xff1a;C1W4.Machine Translation and Document Search 文章目录 1. The word embeddings data for English and French words1.1The dataThe subset of dataLoad two dictionaries 1.2 Generate embedding and transform matricesExercise 1: Translating English…

数学建模-Topsis(优劣解距离法)

介绍 TOPSIS法&#xff08;Technique for Order Preference by Similarity to Ideal Solution&#xff09; 可翻译为逼近理想解排序法&#xff0c;国内常简称为优劣解距离法 TOPSIS 法是一种常用的综合评价方法&#xff0c;其能充分利用原始数据的信息&#xff0c; 其结果能精…

张量分解(5)——Tucker分解

&#x1f345; 写在前面 &#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;这里是hyk写算法了吗&#xff0c;一枚致力于学习算法和人工智能领域的小菜鸟。 &#x1f50e;个人主页&#xff1a;主页链接&#xff08;欢迎各位大佬光临指导&#xff09; ⭐️近…

如何防范场外个股期权的交易风险?

场外个股期权交易&#xff0c;作为金融衍生品市场的重要组成部分&#xff0c;为投资者提供了更为灵活和多样化的投资策略。然而&#xff0c;其高杠杆、高风险特性也使得投资者在追求高收益的同时&#xff0c;面临着较大的交易风险。为了有效防范这些风险&#xff0c;投资者需要…

基于STM32设计的智能门锁(微信小程序+手机APP等多种方式开锁)(188)

基于STM32设计的智能门锁(微信小程序+手机APP等多种方式开锁)(188) 文章目录 一、前言1.1 项目介绍【1】项目功能介绍【2】项目硬件模块组成1.2 设计思路【1】整体设计思路【2】整体构架【3】ESP8266模块配置【4】上位机开发思路【5】供电方式1.3 项目开发背景【1】选题的意义【…

Kafka Producer发送消息流程之Sender发送线程和在途请求缓存区

文章目录 1. Sender发送数据1. 发送数据的详细过程&#xff1a;2. 关键参数配置 2. 在途请求缓存区 1. Sender发送数据 Sender线程负责将已经在RecordAccumulator中准备好的消息批次发送到Kafka集群。虽然消息在RecordAccumulator中是按照分区组织的&#xff0c;但Sender线程在…

【VScode】安装【ESP-IDF】插件及相关工具链

一、ESP-IDF简介 二、VScode安装ESP-IDF插件 三、安装ESP-IDF、ESP-IDF-Tools以及相关工具链 四、测试例程&编译烧录 一、ESP-IDF简介 二、VScode安装ESP-IDF插件 【VScode】安装配置、插件及远程SSH连接 【VSCode】自定义配置 打开VScode&#xff0c;在插件管理搜索esp…

react + pro-components + ts完成单文件上传和批量上传

上传部分使用的是antd中的Upload组件,具体如下: GradingFilingReportUpload方法是后端已经做好文件流,前端只需要调用接口即可 单文件上传 <Uploadkey{upload_${record.id}}showUploadList{false}accept".xlsx"maxCount{1}customRequest{({ file }) > {const …