当前位置: 首页 > news >正文

@PostConstruct 注解

  @PostConstruct 注解用于标记一个方法,该方法需要在依赖注入完成后执行,以完成任何初始化操作。​​此方法必须在类投入使用之前被调用​​。所有支持依赖注入的类都必须支持此注解。即使类没有请求任何资源注入,也必须调用标注了 @PostConstruct 的方法。​​一个类上只能有一个方法被标注此注解​​。(翻译自官方解释)

一、作用

@PostConstruct 注解的主要作用是:

  • ​在依赖注入完成后执行初始化逻辑​​:比如初始化资源、加载配置、建立数据库连接池、启动定时任务等。
  • ​确保对象在使用前已经完成必要的初始化​​,避免在业务代码中手动调用初始化方法。

二、使用场景

以下是一些典型的使用场景: 

  1. ​初始化资源​​:比如加载配置文件、初始化缓存、连接数据库等。

    import javax.annotation.PostConstruct;
    import javax.sql.DataSource;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Component;@Component
    public class DatabaseInitializer {@Autowiredprivate DataSource dataSource; // 假设是通过 Spring 注入的数据源@PostConstructpublic void initDatabaseConnectionPool() {System.out.println("初始化数据库连接池...");// 这里可以执行一些连接池的初始化逻辑,比如测试连接是否可用// 实际项目中可能会调用 dataSource 的一些方法来验证连接System.out.println("数据库连接池初始化完成!");}
    }
  2. ​执行一次性初始化任务​​:比如启动定时任务、注册监听器、预加载数据等。

    import javax.annotation.PostConstruct;
    import org.springframework.stereotype.Component;@Component
    public class CacheInitializer {@PostConstructpublic void preloadCache() {System.out.println("开始预加载数据到缓存...");// 模拟从数据库加载数据到缓存// 比如:List<Data> dataList = dataService.getAllData();// cache.putAll(dataList);System.out.println("缓存预加载完成!");}
    }
  3. ​依赖注入后的校验或设置​​:在依赖注入完成后,对某些属性进行校验或进一步设置。

    import javax.annotation.PostConstruct;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.stereotype.Component;@Component
    public class ConfigValidator {@Value("${app.max.users:100}") // 从配置文件中读取属性,默认值 100private int maxUsers;@PostConstructpublic void validateConfig() {System.out.println("开始校验配置参数...");if (maxUsers <= 0) {throw new IllegalArgumentException("配置参数 app.max.users 必须大于 0");}System.out.println("配置参数校验通过,maxUsers = " + maxUsers);}
    }
  4. ​Spring Bean 的初始化​​:在 Spring 管理的 Bean 中,@PostConstruct 方法会在 Bean 的依赖注入完成后、Bean 被使用前被调用。

    import javax.annotation.PostConstruct;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Component;@Component
    public class MyService {@Autowiredprivate MyRepository myRepository;private boolean initialized = false;@PostConstructpublic void init() {System.out.println("MyService 的 @PostConstruct 方法被调用,开始初始化...");// 模拟一些初始化操作,比如检查数据库连接、加载数据等if (myRepository != null) {System.out.println("依赖注入成功,myRepository 已准备好!");} else {System.out.println("依赖注入失败!");}initialized = true;System.out.println("MyService 初始化完成!");}public void doSomething() {if (!initialized) {throw new IllegalStateException("Service 尚未初始化完成!");}System.out.println("执行业务逻辑...");}
    }

三、使用方式

@PostConstruct 注解标注的方法需要满足以下条件:

  • 方法​​不能有参数​​。
  • 方法​​返回类型必须是 void​。
  • 方法​​不能是 static 的​​。
  • 方法​​可以是 publicprotected 或 package-private(默认)​,但不能是 private(虽然技术上某些框架可能允许,但不推荐)。
import javax.annotation.PostConstruct;
import org.springframework.stereotype.Component;@Component
public class MyService {@PostConstructpublic void init() {System.out.println("MyService 初始化完成,执行初始化逻辑...");// 比如加载配置、初始化资源等}public void doSomething() {System.out.println("执行业务逻辑...");}
}
http://www.dtcms.com/a/293451.html

相关文章:

  • Python进阶第三方库之Numpy
  • Docker-compose:服务编排
  • M3088NL是一款网络滤波器/变压器支持100M和1000M网络环境,适用于高速网络传输场景M3088
  • 单片机的几种GPIO输入输出模型详解
  • JavaWeb学习打卡11(cookie(甜点)详解)
  • iView Table组件二次封装
  • RAG实战指南 Day 21:检索前处理与查询重写技术
  • 数据库隔离级别
  • SQL语句中锁的使用与优化
  • 正则表达式:文本处理的强大工具
  • 傲软录屏 专业高清录屏软件 ApowerREC Pro 下载与保姆级安装教程!!
  • 3.5 模块化编程实践
  • 路径平滑优化算法--Polynomial Spiral(多项式螺旋法)
  • JavaScript 02 数据类型和运算符数组对象
  • JavaScript 03 严格检查模式Strict字符串类型详解
  • 【金融机器学习】第四章:风险-收益权衡——Bryan Kelly, 修大成(中文翻译)
  • Linux Bridge Cost
  • Qt多语言支持初步探索
  • Jmeter使用 - 2
  • 【小学】小学学习资料合集(不定时更新,有需要及时保存,避免失效)
  • ubuntu 20.04 安装 cmake 3.26
  • error C++17 or later compatible compiler is required to use ATen.
  • Spring相关概念
  • 在腾讯云上安装gitlab
  • 《C++》面向对象编程--类(中)
  • Linux的进程管理源码相关内容梳理
  • 京东视觉算法面试30问全景精解
  • 洛谷 B3939:[GESP样题 四级] 绝对素数 ← 素数判定+逆序整数
  • 滑动窗口经典问题整理
  • 三维DP深度解析