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

Java Spring 中常用的 @PostConstruct 注解使用总结

在这里插入图片描述

引言

在最近的学习中,我发现了一个非常实用的注解 —— @PostConstruct。通过深入学习,逐步发现这个注解在实际开发中可以帮助我们更轻松地解决不少原本复杂的问题,特别是在项目启动时自动执行一些必要的初始化操作。相比于手动调用,它更加简洁和方便。

接下来,我将结合实例,详细讲解 @PostConstruct 注解的特性和用法。由于 @PreDestroy 在实际开发中用得较少,所以本文主要聚焦于 @PostConstruct 的应用。

正文

1. 适用场景

@PostConstruct 是在 Java 5 中引入的注解,最早用于 Servlet 生命周期的管理,能够在 Bean 初始化之后执行自定义操作。在实际项目中,@PostConstruct 主要用于在应用启动时加载一些初始化数据,比如缓存预热、数据字典加载或读取配置文件等。

它的一个常见应用场景是依赖注入完成后,需要执行的初始化方法。被 @PostConstruct 注解标记的方法会在 Servlet 初始化之前运行,并且在整个应用生命周期中只会被调用一次。

总结一下 @PostConstruct 的主要特性:

  • 只有一个非静态方法能使用此注解。
  • 被注解的方法不能有任何参数。
  • 被注解的方法必须返回 void 类型。
  • 被注解的方法不得抛出已检查异常。
  • 此方法只会被执行一次。
2. 执行顺序

在 Bean 初始化过程中,@PostConstruct 的执行顺序如下:

  1. 构造方法:通过 @Constructor 完成 Bean 实例化。
  2. 依赖注入:通过 @Autowired 注入 Bean 所需的依赖。
  3. 初始化方法:在依赖注入完成后,Spring 自动调用 @PostConstruct 标记的方法,执行初始化逻辑。

举个例子,在项目启动时如果需要初始化某些资源,我们可以将 @Component@PostConstruct 组合使用,保证在依赖注入完成后执行自定义的初始化操作。

3. 注意事项

使用 @PostConstruct 注解时需要注意以下几点:

  1. 服务启动时间:因为 @PostConstruct 会在服务启动时扫描所有类和依赖库中的 jar 包,过多或复杂的初始化操作可能影响应用启动时间。
  2. 执行一次性操作@PostConstruct 标记的方法只会在 Bean 初始化完成后被执行一次,因此适合执行一些一次性的初始化任务。
  3. 不能使用静态方法:被 @PostConstruct 注解标记的方法不能是静态方法。
  4. 加载顺序:对于静态变量和常量,@PostConstruct 可以帮助避免某些场景下由于变量尚未初始化而出现的 null 问题,具体见后文案例。
4. 案例分析

接下来我们通过两个简单的实例来演示 @PostConstruct 的使用。

4.1 数据预热

在某些场景下,我们可能需要在项目启动时完成缓存的预热操作,比如将常用的数据从数据库中加载到内存中。通常情况下,如果使用 Redis 进行缓存,需要在第一次调用时触发缓存。但通过 @PostConstruct,我们可以提前在项目启动时完成数据预热。

@Slf4j
@Configuration
public class BeanConfiguration {@Autowiredprivate BusinessService businessService;// 模拟预热的数据private static String mysql_data;@PostConstructpublic void construct() {log.info("依赖注入完成,开始预热数据...");mysql_data = businessService.demo5();log.info("数据预热完成:mysql_data = " + mysql_data);}
}@Slf4j
@Service
public class BusinessServiceImpl implements BusinessService {/*** 模拟从数据库查询数据的操作*/public String demo5() {log.info("从数据库加载数据...");return "mysql data";}
}

执行效果:在项目启动时,mysql_data 会被从数据库中加载并完成预热。

4.2 加载配置文件

在很多项目中,我们会使用 @Value 注解从配置文件中读取常量。但 @Value 注解的常量不能是静态的,因为静态字段会在 @Value 加载之前初始化,导致其值为 null。通过 @PostConstruct,我们可以在 Bean 初始化之后手动为静态字段赋值,避免这个问题。

@Slf4j
@Component
public class GlobalConstent {@Value("${server.port}")private String port;// 模拟静态常量public static String server_port;@PostConstructpublic void construct() {log.info("Before PostConstruct:" + server_port);server_port = port;log.info("After PostConstruct:" + server_port);}
}

在使用过程中,静态常量 server_port 可以通过类名直接访问:

@Slf4j
@RestController
@RequestMapping("/construct")
public class PostConstructController {@RequestMapping("/demo")public String demo() {log.info("当前服务端口:" + GlobalConstent.server_port);return "success";}
}

结果展示:在项目启动之前,server_port 会通过 @PostConstruct 完成赋值操作。

5. 总结

通过本文,晓得嘞 @PostConstruct 注解的适用场景、执行顺序和使用中的注意事项。我们通过两个实际案例展示了如何利用 @PostConstruct 进行数据预热和配置文件加载。

@PostConstruct 在项目中非常有用,特别是在需要依赖注入完成后自动执行某些初始化任务的场景。它不仅简化了代码逻辑,还提高了项目的启动效率。如果你在项目中需要进行初始化操作,不妨试试这个注解。

要点:

  • @PostConstruct 只会在 Bean 初始化后执行一次,适合执行一次性初始化任务。
  • 它的执行顺序是在构造方法和依赖注入之后。
  • 使用时要注意静态变量的赋值顺序问题。

希望本文对你理解 @PostConstruct 注解有所帮助,下面一起Demo搞起来吧。

在这里插入图片描述

http://www.lryc.cn/news/463124.html

相关文章:

  • Visual Studio--VS安装配置使用教程
  • 什么叫CMS?如何使用CMS来制作网站?
  • 如何获取谷歌浏览器窗口句柄并将其设置为Qt的父窗口
  • 牛客小白月赛102:最短?路径(分层bfs)
  • JSON字符串转成java的Map对象
  • 重读《人月神话》(8)-为什么巴比伦塔会失败?(Why Did the Tower of Babel Fail?)
  • STL源码剖析:Hashtable
  • spring-boot学习(2)
  • 《案例》—— OpenCV 实现2B铅笔填涂的答题卡答案识别
  • 新员工入职流程指南_完整入职流程解析
  • mysql查看和修改默认配置
  • 海外云手机:出海电商养号智能化方案
  • OpenAI Canvas用户反馈:并不如外界传言般“炸裂”,更不是“AGI的终极交互形态” | LeetTalk Daily...
  • RiproV9.0主题wordpress主题免扩展可二开PJ版/WordPress博客主题Ripro全解密无后门版本
  • [LeetCode] 515. 在每个树行中找最大值
  • 【分布式微服务云原生】《微服务架构大揭秘:流行框架与服务治理攻略》
  • uniapp uni.uploadFile errMsg: “uploadFile:fail
  • 一个常见问题:TCP和UDP是否可以使用一个端口
  • 前端报错:‘vue-cli-service‘ 不是内部或外部命令,也不是可运行的程序(node_modules下载不下来)
  • 白日门【鬼服无限刀】win服务端+安卓客户端+教程+GM后台
  • 如何迅速的了解一个人
  • Window和Linux远程调度kettle
  • 设定义结构变量
  • SSD |(七)FTL详解(中)
  • Swift 协议:深入解析与高级应用
  • API项目3:API签名认证
  • unity学习-Directional light光的设置
  • 简单实现通过电脑操作手机
  • 基于ESP32的便携式游戏机
  • 【LeetCode 88. 合并两个有序数组】 java实现