Spring Boot 项目中 @Value 注解失效问题
问题描述
在 Spring Boot 项目中,我们使用 @Value
注解从 application.yml
配置文件中注入配置值。但是,由于同事直接 new 创建了含有 @Value
注解的类实例,导致注解失效。
配置文件 application.yml
yaml
# ${service-model} 读取的是 pom.xml 文件中自定义的属性,可以直接定义,例如:test
service-model: ${service-model}
实体类 Demo
java
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Slf4j
@Component
public class Demo {
@Value("${service-model}")
private String serviceModel;
public void getValue() {
System.out.println("serviceModel = " + serviceModel);
}
}
// 输出结果为 null,因为 @Value 注解失效
处理逻辑
由于 @Value
注解失效,我们使用 SnakeYAML 库直接读取 yml
配置文件并获取配置信息。
导入依赖
xml
<dependency>
<groupId>org.yaml</groupId>
<artifactId>snakeyaml</artifactId>
<version>1.31</version>
</dependency>
创建读取配置工具类 YamlUtil
java
import org.yaml.snakeyaml.Yaml;
import org.yaml.snakeyaml.constructor.Constructor;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
/**
* 获取 YAML 配置文件参数
*/
public class YamlUtil {
public static Map<String, Object> getConfigInfo(String fileName) {
Yaml yaml = new Yaml(new Constructor(Map.class));
Map<String, Object> config = new HashMap<>();
try (InputStream inputStream = YamlUtil.class.getClassLoader().getResourceAsStream(fileName)) {
// 加载 YAML 文件
config = yaml.load(inputStream);
} catch (Exception e) {
e.printStackTrace();
}
return config;
}
}
使用方法
java
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class Demo {
public void getValue() {
Map<String, Object> configInfo = YamlUtil.getConfigInfo("application.yml");
String serviceModel = (String) configInfo.get("service-model");
System.out.println("serviceModel = " + serviceModel);
}
}
// 输出结果为 "test",因为通过 YamlUtil 成功读取了配置文件
总结
通过上述步骤,我们解决了 @Value
注解失效的问题,并提供了一个替代方案来读取配置文件中的值。这样可以确保即使在 @Value
注解无法正常工作的情况下,也能正确地获取配置信息。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了