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

@PostConstruct注解解释!!!!

@PostConstruct 注解修饰的方法是在 Bean 完成初始化后自动调用的。它是 Java EE 和 Spring 中的一种机制,用于在 Bean 被创建并依赖注入完成后,执行一些初始化的操作。

具体触发时机:

  1. 依赖注入完成后:首先,Spring 容器会创建一个对象,并将所有依赖注入到该对象中(通过构造函数、字段或 setter 方法)。

  2. 初始化方法调用之前:依赖注入完成后,Spring 会调用带有 @PostConstruct 注解的方法,这通常是做一些初始化工作,比如验证、配置、日志记录等。

  3. 在 Bean 使用之前@PostConstruct 方法在 Spring 容器将 Bean 标记为“可用”之前调用,意味着此时对象已经完全创建并注入了所有依赖,但还没有开始被使用(即对象没有真正被服务或业务逻辑使用)。

使用示例:

假设我们有一个 Spring 类,需要在依赖注入完成后进行一些初始化工作,可能是初始化资源、进行校验或设置某些字段的默认值:

import javax.annotation.PostConstruct;

public class MyService {

    private String message;

    // 依赖注入的字段
    private MyDependency myDependency;

    // 构造函数、setter等依赖注入方法

    @PostConstruct
    public void init() {
        // 依赖注入完成后执行的初始化方法
        System.out.println("MyService is initialized with message: " + message);
        
        // 进行一些初始化逻辑,比如校验数据或初始化连接等
        if (myDependency == null) {
            throw new IllegalStateException("myDependency must be set!");
        }
    }
}

执行顺序:

  1. 实例化 Bean:Spring 创建 MyService 的实例。
  2. 依赖注入:Spring 根据配置自动将 MyDependency 注入到 MyService 实例中。
  3. 调用 @PostConstruct 方法:在依赖注入完成后,init 方法被自动调用。
  4. Bean 可用@PostConstruct 方法执行完成后,MyService Bean 被标记为可以使用。

注意事项:

  • 一个类中只能有一个 @PostConstruct 方法:如果类中有多个方法被 @PostConstruct 注解,Spring 会抛出异常。
  • 仅在 Spring 管理的 Bean 上有效@PostConstruct 只会在 Spring 管理的 Bean 上生效,比如通过 @Component@Service 等注解或 XML 配置方式定义的 Bean。
  • 支持与 @PreDestroy 配合使用@PostConstruct 配合 @PreDestroy 注解使用,可以在 Bean 销毁前执行清理工作。

总结:

@PostConstruct 是 Spring 生命周期的一部分,用于在 Bean 完成依赖注入之后、实际使用之前执行初始化工作。它是一个非常重要的注解,尤其是在需要在 Bean 完成所有注入后进行某些设置或验证时非常有用。

不懂的看

Spring 启动流程!!!-CSDN博客


http://www.kler.cn/a/443243.html

相关文章:

  • 备忘录记事工具 四款好用的电脑备忘录记事本分享
  • Spring Boot教程之四十九:Spring Boot – MongoRepository 示例
  • ArrayList和HashMap区别
  • Web应用安全-漏洞扫描器设计与实现
  • Flutter Web 中文字体显示异常问题
  • thinkphp6.0常用设计模式实例
  • 【React前端】大屏适配解决方案从框架结构到实现(超详细)(附代码)
  • Java项目--仿RabbitMQ的消息队列--网络通信协议设计
  • [BJDCTF2020]ZJCTF,不过如此 1
  • gbase8s之常用sql脚本
  • 浅谈单例模式
  • 【AI图像生成网站Golang】项目测试与优化
  • 电脑上怎么运行手机APP(电脑上运行手机APP的4种方法)
  • 深入解析java.lang.NumberFormatException异常及解决方法
  • Ubuntu交换区(Swap)扩容方法
  • linux 查找当前目录下大于10G的目录,并删除它们
  • mac电脑可以使用的模拟器
  • 网络术语MSS/MTU/TSO/Len说明
  • ABP vNext多租户配置及通过域名方式解析租户的实现
  • 构建一个rust生产应用读书笔记6-拒绝无效订阅者02
  • 深入探索Vue.js中的methods选项:事件处理与业务逻辑的核心机制
  • Android Compose Modifier
  • 简单了解一下 Go 语言的构建约束?
  • ES6中的map和set
  • PHP代码审计学习(一)--命令注入
  • Linux 常用命令功能解析:man、apropos、locate 和 which