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

【Spring】@Value注入配置文件 application.yml 中的值失败怎么办


本期目录

  • 一、 问题背景
  • 二、 问题原因
  • 三、 解决方法


一、 问题背景

今天碰到的问题是用 @Value 注解无法注入配置文件 application.yml 中的配置值。

检查过该类已经交给 Spring 容器管理了,即已经在类上加了 @Configuration@ConfigurationProperties(prefix = "xxx") 注解了。但还是注入失败。

下面是配置文件 application.yml 中要注入的配置值:

student: name: Tomage: 21

问题伪代码如下:

@Configuration
@ConfigurationProperties(prefix = "student")
public class StudentConfig {@Value("${student.name}")private String name;@Value("${student.age}")private int age;private Map<Long, Student> stuMap = new HashMap<>();// 使用空参构造器初始化stuMappublic StudentConfig() {stuMap.put(1001L, new Student(name, age));}
}

看起来没有问题,但当我获取 stuMap 中的 Student 对象时,却发现其两个属性 namenullage = 0 。
我明明已经通过 @Value 注入配置文件 application.yml 中的值了呀,为什么会注入失败呢?


二、 问题原因

上面的代码之所以注入失败,错误点在于我使用了构造器来初始化 stuMap 。要知道为什么,首选要知道 Spring 容器中 Bean 的生命周期。

Spring 创建 Bean 的过程如下:

构造器 --> 自动注入 (包括 @Value@Autowired ) --> @PostConstruct 修饰的初始化方法

从上面的执行顺序就不难看出,构造器中的方法首先被执行,此时两个属性 nameage 都还没被注入呢,自然就是 null 和 0 ;构造器方法执行完毕后,才到自动注入,这时候两个属性 nameage 才被赋值,但已经晚了。


三、 解决方法

根据Spring 创建 Bean 的执行顺序:

构造器 --> 自动注入 (包括 @Value@Autowired ) --> @PostConstruct 修饰的初始化方法

只要把原来写在构造器中的初始化代码,写到一个用 @PostConstruct 修饰的方法中即可。

修改后的代码就能成功注入配置文件 application.yml 中的值了。

@Configuration
@ConfigurationProperties(prefix = "student")
public class StudentConfig {@Value("${student.name}")private String name;@Value("${student.age}")private int age;private Map<Long, Student> stuMap = new HashMap<>();// 使用@PostConstruct注解初始化stuMap@PostConstructpublic void initStuMap() {stuMap.put(1001L, new Student(name, age));}
}

以上就是我工作中遇到的问题了,希望对你有帮助。

相关文章:

【Spring】@Value注入配置文件 application.yml 中的值失败怎么办

本期目录一、 问题背景二、 问题原因三、 解决方法一、 问题背景 今天碰到的问题是用 Value 注解无法注入配置文件 application.yml 中的配置值。 检查过该类已经交给 Spring 容器管理了&#xff0c;即已经在类上加了 Configuration 和 ConfigurationProperties(prefix &quo…...

CleanMyMac清理工具软件功能优势介绍

CleanMyMac更新最新版本x4.12&#xff0c;完美适配新版系统macOS10.14&#xff0c;拥有全新的界面。CleanMyMac可以让您安全、智能地扫描和清理整个系统&#xff0c;删除大型未使用的文件&#xff0c;减少iPod库的大小&#xff0c;最精确的应用程序卸载&#xff0c;卸载不必要的…...

【面试题】对JS中的事件冒泡、事件捕获、事件委托的理解

大厂面试题分享 面试题库后端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★地址&#xff1a;前端面试题库DOM事件流&#xff08;event flow &#xff09;存在三个阶段&#xff1a;事件捕获阶段、处于目标阶段、事件冒泡阶段。Dom标准事件流的触发的先…...

SAP 理解合并会计报表

随着企业集团的发展&#xff0c;集团内部会出现越来越多的公司&#xff1b;复杂的公司结构和复杂的集团内业务&#xff0c;使得集团内部管理困难重重&#xff0c;信息渠道严重失灵。除了内部管理的需要&#xff0c;企业还有义务向相关方提供详细的和及时的信息。ERP中的合并会计…...

Ubuntu 命令常用命令——定时启动程序

crontab -e 语法 crontab[ -u user ] file或 crontab[ -u user ] { -l | -r | -e }说明: crontab是用来让使用者在固定时间或固定间隔执行程序之用&#xff0c;换句话说&#xff0c;也就是类似使用者的时程表。 -U Lser 是指设定指定user的时程表&#xff0c;这个前提是你必…...

笔试题(十三):走迷宫

# 描述 # 定义一个二维数组 N*M &#xff0c;如 5 5 数组下所示&#xff1a; # int maze[5][5] { # 0, 1, 0, 0, 0, # 0, 1, 1, 1, 0, # 0, 0, 0, 0, 0, # 0, 1, 1, 1, 0, # 0, 0, 0, 1, 0,}; # 它表示一个迷宫&#xff0c;其中的1表示墙壁&#xff0c;0表示可以走的路&#…...

Gradle相关的知识学习

这里有一套博客文章写的比较通俗易懂&#xff1a;https://www.jianshu.com/p/8e1ddd19083a...

SpringMVC的工作原理

SpringMVC的工作原理流程图 SpringMVC流程 1、 用户发送请求至前端控制器DispatcherServlet。 2、 DispatcherServlet收到请求调用HandlerMapping处理器映射器。 3、 处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找)&#xff0c;生成处理器对象及处理器拦截…...

问卷数据分析流程

文章目录一、数据合并1. 读取数据2. 数据预览二、数据清洗1. 检验ID是否重复&#xff0c;剔除ID重复项2. 剔除填写时间小于xx分钟的值3.处理 量表题 一直选一个选项的问题三、数据清洗1.1 将问卷单选题的选项code解码&#xff0c;还原成原来的选项1.2 自动获取单选题旧的选项列…...

【观察】Solidigm P44 Pro SSD评测:原厂品质+软硬兼施=性能怪兽

众所周知&#xff0c;目前SSD&#xff08;固态硬盘&#xff09;已取代HDD&#xff08;机械硬盘&#xff09;成为电脑中常见的存储设备&#xff0c;特别是在技术创新的持续推动下&#xff0c;如今SSD的速度和效率都在不断地提高&#xff0c;从SATA2 3GB发展到SATA3 6GB&#xff…...

String对象的创建和比较

String类的概述 String类&#xff1a;代表字符串。 Java 程序中的所有字符串字面值&#xff08;如 “abc” &#xff09;都作 为此类的实例实现。 String是JDK中内置的一个类&#xff1a;java.lang.string 。 String表示字符串类型&#xff0c;属于引用数据类型&#xff0c;不…...

09 OpenCV图形检测

1 轮廓描边 cv2.findContours() 函数是OpenCV中用于寻找轮廓的函数之一。它可以用于在二值图像中查找并检测出所有的物体轮廓&#xff0c;以及计算出这些轮廓的各种属性&#xff0c;例如面积、周长、质心等。 cv2.findContours() 函数的语法如下&#xff1a; contours, hiera…...

解密Teradata与中国市场“分手”背后的原因!国产数据库能填补空白吗?

2月15日&#xff0c;西方的情人节刚刚过去一天&#xff0c;国内IT行业就爆出一个大瓜。 继Adobe、甲骨文、Tableau、Salesforce之后&#xff0c;又一个IT巨头要撤离中国市场。 Teradata天睿公司官宣与中国市场“分手”&#xff0c;结束在中国的直接运营。目前&#xff0c;多家…...

Bernstein-Vazirani算法

B-V算法 (1) 问题描述 给定布尔函数f:{0,1}n→0,1f:{\left\{ {0,1} \right\}^n} \to{0,1}f:{0,1}n→0,1, 函数fff的值是由输入比特串xxx和确定的比特串sss做模2意义下的内积&#xff1a;f(x)x⋅s(mod2),f\left( x \right) x \cdot s\left( {\bmod 2} \right),f(x)x⋅s(mod2),…...

华为OD机试 - 相对开音节 | 备考思路,刷题要点,答疑 【新解法】

最近更新的博客 【新解法】华为OD机试 - 关联子串 | 备考思路,刷题要点,答疑,od Base 提供【新解法】华为OD机试 - 停车场最大距离 | 备考思路,刷题要点,答疑,od Base 提供【新解法】华为OD机试 - 任务调度 | 备考思路,刷题要点,答疑,od Base 提供【新解法】华为OD机试…...

MyBatis

一、MyBatis环境搭建创建工程启动idea开发工具&#xff0c;选择工具栏中的“file”--“new”--“project”选项弹出“new project”对话框&#xff0c;编辑项目名称 选择maven项目&#xff0c;项目路径 单击 create 创建即可。引入相关依赖<dependencies><dependency&…...

良好的作息表

今天给大家带来“传说中”的“世界上最健康的作息时间表”(仅供参考)&#xff0c;随时提醒自己吧&#xff0c;毕竟身体可是自己的哦。 7:30 起床&#xff1a;英国威斯敏斯特大学的研究人员发现&#xff0c;那些在早上5:22-7:21分起床的人&#xff0c;其血液中有一种能引起心脏病…...

【郭东白架构课 模块一:生存法则】01|模块导学:是什么在影响架构活动的成败?

你好&#xff0c;我是郭东白。这节课是我们模块一的导入部分&#xff0c;我会先来介绍模块的主要内容&#xff0c;以及为什么我要讲生存法则这个话题。 一名软件架构师要为相对复杂的业务制定&#xff0c;并且引导实施一个结构化的软件方案。这个发现最终方案和推动实施的过程&…...

webshell免杀之函数与变量玩法

webshell免杀之函数与变量玩法 前言 前文列举了一些用符号免杀的例子&#xff0c;此篇文章就以函数和变量来尝试下免杀。 本文以PHP为例&#xff0c;用PHP中函数和变量及语法特性&#xff0c;在不隐藏函数关键字情况下进行免杀。 动态函数 PHP中支持一个功能叫 variable fu…...

【新解法】华为OD机试 - 去重求和 | 备考思路,刷题要点,答疑,od Base 提供

华为 OD 清单查看地址:blog.csdn.net/hihell/category_12199275.html 去重求和 | 备考思路,刷题要点,答疑,od Base 提供 给定一个数组,编写一个函数, 计算他的最大N个数和最小N个数的和, 需要对数组进行去重。 输入 第一行输入M,M表示数组大小 第二行输入M个数,表…...

后进先出(LIFO)详解

LIFO 是 Last In, First Out 的缩写&#xff0c;中文译为后进先出。这是一种数据结构的工作原则&#xff0c;类似于一摞盘子或一叠书本&#xff1a; 最后放进去的元素最先出来 -想象往筒状容器里放盘子&#xff1a; &#xff08;1&#xff09;你放进的最后一个盘子&#xff08…...

大数据学习栈记——Neo4j的安装与使用

本文介绍图数据库Neofj的安装与使用&#xff0c;操作系统&#xff1a;Ubuntu24.04&#xff0c;Neofj版本&#xff1a;2025.04.0。 Apt安装 Neofj可以进行官网安装&#xff1a;Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》

引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...

Python实现prophet 理论及参数优化

文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候&#xff0c;写过一篇简单实现&#xff0c;后期随着对该模型的深入研究&#xff0c;本次记录涉及到prophet 的公式以及参数调优&#xff0c;从公式可以更直观…...

css的定位(position)详解:相对定位 绝对定位 固定定位

在 CSS 中&#xff0c;元素的定位通过 position 属性控制&#xff0c;共有 5 种定位模式&#xff1a;static&#xff08;静态定位&#xff09;、relative&#xff08;相对定位&#xff09;、absolute&#xff08;绝对定位&#xff09;、fixed&#xff08;固定定位&#xff09;和…...

LLM基础1_语言模型如何处理文本

基于GitHub项目&#xff1a;https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken&#xff1a;OpenAI开发的专业"分词器" torch&#xff1a;Facebook开发的强力计算引擎&#xff0c;相当于超级计算器 理解词嵌入&#xff1a;给词语画"…...

让AI看见世界:MCP协议与服务器的工作原理

让AI看见世界&#xff1a;MCP协议与服务器的工作原理 MCP&#xff08;Model Context Protocol&#xff09;是一种创新的通信协议&#xff0c;旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天&#xff0c;MCP正成为连接AI与现实世界的重要桥梁。…...

技术栈RabbitMq的介绍和使用

目录 1. 什么是消息队列&#xff1f;2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...

基于Java+MySQL实现(GUI)客户管理系统

客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息&#xff0c;对客户进行统一管理&#xff0c;可以把所有客户信息录入系统&#xff0c;进行维护和统计功能。可通过文件的方式保存相关录入数据&#xff0c;对…...

逻辑回归暴力训练预测金融欺诈

简述 「使用逻辑回归暴力预测金融欺诈&#xff0c;并不断增加特征维度持续测试」的做法&#xff0c;体现了一种逐步建模与迭代验证的实验思路&#xff0c;在金融欺诈检测中非常有价值&#xff0c;本文作为一篇回顾性记录了早年间公司给某行做反欺诈预测用到的技术和思路。百度…...