Spring中@PostConstruct注解的使用

news2024/9/22 1:45:25

1.描述

1.1 背景

        最近在做一个系统交互日志模块,要监控一个http请求,并记录请求与响应日志。项目中使用RestTemplate来发送http请求,所以打算给RestTemplate设置拦截器,来进行自定义操作。但是,只对当前类生效,不能影响到其他RestTemplate的使用。然而,在改造过程中,遇到了bean为空的情况,经排查,是因为在构造方法中使用这个bean给RestTemplate初始化拦截器操作时,bean的依赖注入还未完成,出现了空指针异常。那么是不是有一种方式,在bean依赖注入完成之后,再执行初始化呢?当然有,@PostConstruct就能解决这个问题,比较推荐这种方式。

1.2 注意事项

关于bean的使用,我们要注意:

(1)要注意bean的加载与使用顺序:如果使用该bean时,bean为空,无非就俩种情况:a:未被spring管理、b:使用该bean时,该bean的依赖注入还未完成。

(2)要将bean交给spring管理,通过依赖注入的方式去使用:如果该bean中,依赖了别的bean。那么要将该bean交给spring管理,且使用该bean时,要通过依赖注入的方式去拿,而不要去new。

2.@PostConstruct简单介绍

2.1 简介:

   @PostConstruct 是 Java 中的一个注解,用于在 Spring 框架中指定初始化方法。当一个 Bean 被实例化之后,如果该 Bean 类中存在用 @PostConstruct 注解的方法,那么该方法会在依赖注入(DI)完成后被自动调用,用于执行一些自定义的初始化操作。

2.2 @PostConstruct的作用

  • 初始化操作:在bean的依赖注入完成后,执行一些初始化操作。
  • 资源准备:比如数据库连接、文件系统访问等,需要在依赖注入完成后才能进行。
  • 状态验证:可以检查bean的依赖是否正确注入,或者做一些状态的验证。

2.3  @PostConstruct 的一些关键点:

  • @PostConstruct 注解用于在依赖注入完成后执行 Bean 的初始化逻辑。
  • 一个类中只能有一个方法用 @PostConstruct 注解。
  • 被 @PostConstruct 注解的方法不能有参数,并且返回类型必须为 void
  • 被 @PostConstruct 注解的方法通常应该是非静态的,但如果它所在类是单例模式,那么静态方法也可以被注解。

2.4 举例

(1)执行顺序:构造函数被调用——>@PostConstruct 方法被调用

import javax.annotation.PostConstruct;

public class MyClass {
    private String message;

    public MyClass() {
        System.out.println("构造函数被调用");
    }

    @PostConstruct
    public void init() {
        System.out.println("@PostConstruct 方法被调用");
        message = "Hello, World!";
    }

    public String getMessage() {
        return message;
    }
}

        在这个例子中,我们有一个名为 MyClass 的类,它有一个私有成员变量 message。我们在构造函数中打印一条消息,然后在 init 方法上使用 @PostConstruct 注解。当 Spring 容器创建 MyClass 的实例并完成依赖注入后,它会调用 init 方法来初始化 message 变量。

 (2)初始化时从文件系统加载一些配置数据:

import org.springframework.stereotype.Service;
import javax.annotation.PostConstruct;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

@Service
public class ConfigurationService {

    private String configData;

    @PostConstruct
    public void loadConfigData() {
        try (BufferedReader reader = new BufferedReader(new FileReader("config.properties"))) {
            StringBuilder sb = new StringBuilder();
            String line;
            while ((line = reader.readLine()) != null) {
                sb.append(line).append("\n");
            }
            configData = sb.toString();
            System.out.println("Configuration data loaded.");
        } catch (IOException e) {
            throw new RuntimeException("Failed to load configuration data", e);
        }
    }

    public String getConfigData() {
        return configData;
    }
}

        在这个例子中,loadConfigData 方法被@PostConstruct注解所标记。当Spring IoC容器创建并完成ConfigurationService Bean的依赖注入后,这个方法就会被自动调用。 

        此外,一个类中可以有多个带有@PostConstruct注解的方法,但是通常建议只使用一个这样的方法来保持代码的清晰性和可维护性。如果需要更复杂的初始化逻辑,考虑使用InitializingBean接口或者init-method属性。

注:Spring bean的加载注入顺序大体是构造方法 -> 依赖注入 -> @PostConstruct注解的方法

3.扩展:bean的加载流程

Spring的bean加载和注入过程主要分为以下几个步骤:

  • 加载BeanDefinition

    • Spring容器通过扫描类路径、解析注解或读取XML配置文件,加载bean定义。
  • 注册BeanDefinition

    • 将加载的bean定义注册到BeanDefinitionRegistry中。
  • 创建Bean实例

    • 容器根据bean定义创建bean实例。
  • 属性填充

    • 容器会根据bean定义中的属性值,填充bean实例的属性。
  • 依赖注入

    • 容器会解析bean定义中的依赖关系,并注入相应的bean或值。
  • 调用@PostConstruct方法

    • 在依赖注入完成后,调用bean的@PostConstruct方法。
  • 初始化Bean

    • 容器会调用bean的初始化方法(如果有),比如实现了InitializingBean接口的afterPropertiesSet方法。
  • Bean准备就绪

    • 所有初始化操作完成后,bean就可以被使用了。

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

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

相关文章

《昇思25天学习打卡营第23天|RNN实现情感分类》

使用RNN进行情感分类:基于IMDB数据集的LSTM应用 引言 情感分析是自然语言处理(NLP)中的一个重要应用,广泛用于电影评论、社交媒体等文本数据的情感分类任务。本文将介绍如何使用递归神经网络(RNN)实现情感…

InternLM学习笔记

入门岛 1. Linux基础知识 2. Python 基础知识 from collections import Countertext """ Got this panda plush toy for my daughters birthday, who loves it and takes it everywhere. Its soft and super cute, and its face has a friendly look. Its a …

[linux] seqeval安装报错

新建一个新的环境 然后安装: # 不能拷贝别人的环境再安mebert_wash的环境。有冲突。我需要重新安一个空的conda环境,再安装。 # conda create -n wash python3.10 ipykernel python -m pip install --upgrade setuptools python -m pip install --upgr…

函数-递归调用

目录 一、基本介绍 二、递归能解决什么问题? 三、递归案例 1、打印问题 2、阶乘问题 四、递归重要规则 五、课堂练习 1、斐波那契数 2、猴子吃桃问题 3、汉诺塔 一、基本介绍 1、简单地说:递归就是函数自己调用自己,每次调用时传入…

利用python自动化运维i脚本实现远程连接服务器并实现相应命令

目录 前言: 一.调用的python库介绍 二.在主机上安装好相应的库 2.1激活虚拟环境 三.代码实现以及解析 四.效果的实现 五.致谢 前言: 在当今快速发展的技术环境中,自动化运维已成为 IT 基础设施管理的关键组成部分。它不仅可以显著提…

SPSS个人版是什么软件

SPSS是一款数据统计、分析软件,它由IBM公司出品,这款软件平台提供了文本分析、大量的机器学习算法、数据分析模型、高级统计分析功能等,软件易学且功能非常强大,可以使用SPSS制作图表,例如柱状、饼状、折线等图表&…

CasaOS设备使用Docker安装SyncThing文件同步神器并实现远程管理

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

基于 HTML+ECharts 实现智慧景区数据可视化大屏(含源码)

构建智慧景区数据可视化大屏:基于 HTML 和 ECharts 的实现 随着旅游业的蓬勃发展,智慧景区的概念逐渐深入人心。通过数据可视化,景区管理者可以实时监控游客流量、设施使用情况以及环境状况,从而提升游客体验和管理效率。本文将详…

昇思学习打卡-22-生成式/DCGAN生成漫画头像

文章目录 DCGAN网络数据处理构造网络生成器判别器损失函数优化器 结果展示 我们将学习DCGAN网络如何数据处理、设置网络,包括生成器、判别器、损失函数、优化器等。 DCGAN网络 DCGAN(深度卷积对抗生成网络,Deep Convolutional Generative Ad…

数据结构之《队列》

在数据结构之《栈》章节中学习了线性表中除了顺序表和链表外的另一种结构——栈,在本篇中我们将继续学习另一种线性表的结构——队列,在通过本篇的学习后,你将会对栈的结构有充足的了解,在了解完结构后我们还将进行栈的实现。一起…

JavaScript——变量与运算符、输入输出、判断、循环

文章目录 前言概述使用 js从文件引入 js 代码importjs 的作用变量计算输入格式化输出保留小数向上取整,向下取整条件判断循环总结 前言 为了监督自己的进度,把学习任务一点点都写出来,写多少就算多少,不求完美,只求完…

计算的是如何工作的

文章目录 一. 冯诺依曼体系结构二. CPU三. 指令*四. CPU是如何执行指令的 一. 冯诺依曼体系结构 冯诺依曼是计算机领域的祖师爷, 被评为"二十一世纪最伟大的"全才"" 冯诺依曼提出了冯诺依曼体系结构, 定义了一台计算机, 由这几部分构成: 输入设备: 包括…

STM32---HAL库外设配置--串口外设配置及使用

一:首先按照本人的时钟配置博客配置,配置好基础时钟 二:选择对应串口进行选中,然后配置 配置如下:首先配置成异步收发模式,如图中的序号1 参数设置界面选择默认即可如下图 下图中的1不用设置,默认即可。2…

增长新引擎,构建基于 CDP 的用户运营竞争力

本文将围绕“企业如何通过构建基于 CDP 的用户运营体系提升业务增长”这一核心,详细介绍企业数据化运营现状,拆解用户运营目标,展示神策 CDP 的关键能力以及用户运营策略落地的完整路径。 一、洞察:企业数据化运营面临的挑战 当前…

系统编程--Linux下文件的“其他操作”函数

这里写目录标题 文件存储理论补充dentry、inode 文件其他操作stat函数作用函数原型代码(以获取文件大小为例)补充(获取文件类型) lstat函数作用函数原型代码补充(获取文件权限)总结 tipslink函数作用简介函…

看板项目之vue代码分析

目录: Q1、vue项目怎么实现的输入localhost:8080就能自动跳到index页面Q2、组合饼状图如何实现Q3、vue项目如何实现环境的切换Q4、vue怎么实现vue里面去调用js文件里面的函数 Q1、vue项目怎么实现的输入localhost:8080就能自动跳到index页面 …

OZON家庭洗剂产品,OZON热卖家庭洗剂用品有哪些

OZON平台上家庭洗剂产品的热销情况主要反映了俄罗斯家庭对于环保、高效、多功能的清洁用品的需求。根据最新数据和市场趋势,以下是一些OZON平台上热卖的家庭洗剂用品:OZON热卖家庭洗剂用品:D。DDqbt。COm/74rD Top1 洗碗液 ЭКО. Гел…

免费【2024】springboot 毕业设计管理系统

博主介绍:✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌ 技术范围:SpringBoot、Vue、SSM、HTML、Jsp、PHP、Nodejs、Python、爬虫、数据可视化…

反序列化-极客大挑战2019php【I have a cat!】

知道这个题考的是反序列化,那么我们第一反应该拿到他的源码。 根据这句话判断【因为每次猫猫都在我键盘上乱跳,所以我有一个良好的备份网站的习惯 不愧是我!!! 】说明有目录 我们直接使用dir开扫,发现有压…

Redis的应用场景及类型

目录 一、Redis的应用场景 1、限流 2、分布式锁 3、点赞 4、消息队列 二、Redis类型的命令及用法 1、String类型 2、Hash类型 3、List类型 4、Set类型 5、Zset类型 6、Redis工具类 Redis使用缓存的目的就是提升读写性能 实际业务场景下,我们就可以把 Mys…