在 Spring Boot 中可通过 @Value 注入 application.properties 或 application.yml 中定义的自定义属性,支持默认值、类型自动转换及 SpEL 表达式,但仅适用于 Spring 管理的 Bean。

在 Spring Boot 中,自定义属性并用 @Value 读取非常简单,核心是把配置写在 application.properties 或 application.yml 里,再通过 @Value 注入到字段中。
1. 在配置文件中定义自定义属性
支持两种主流格式:
-
properties 格式(
application.properties):
my.app.name=MySpringApp
my.app.timeout=3000
my.app.features.enabled=true -
yml 格式(
application.yml):
my:
app:
name: MySpringApp
timeout: 3000
features:
enabled: true
2. 使用 @Value 注入属性值
在 Spring 管理的 Bean(如 @Component、@Service、@RestController)中直接注入:
@Component
public class AppConfig {
@Value("${my.app.name}")
private String appName;
<pre class="brush:php;toolbar:false;">@Value("${my.app.timeout:5000}") // 冒号后是默认值
private int timeout;
@Value("${my.app.features.enabled:false}")
private boolean featuresEnabled;}
注意:
- 属性占位符必须用 ${...} 包裹;
- 推荐始终提供默认值(如 :5000),避免启动失败;
- 类型会自动转换(String、int、boolean、long 等基本类型及包装类都支持)。
3. 处理特殊字符或表达式(可选进阶)
如果属性值含占位符、SpEL 表达式或需运行时计算,@Value 也支持:
- 引用其他属性:
@Value("${my.app.name}-v1") - SpEL 运算:
@Value("#{systemProperties['os.name'] ?: 'Unknown'}") - 带空格或特殊字符的值(yml 中需加引号):
my.app.title: "My App v2.0"→@Value("${my.app.title}")可正常读取
4. 注意事项与常见问题
-
@Value只能在 Spring 容器管理的 Bean 中生效(不能在 new 出来的对象或静态字段上使用) - 属性名严格区分大小写和层级(
my.app.timeout≠my.App.Timeout) - 若提示
Could not resolve placeholder,检查:配置文件路径是否正确(必须在src/main/resources/)、属性名拼写、是否启用对应 profile - 复杂结构(如列表、嵌套对象)建议改用
@ConfigurationProperties,更安全、可校验、支持 IDE 提示
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











