@Value用于注入配置文件属性,支持${}占位符(含默认值)和#{} SpEL表达式,仅适用于Spring管理Bean,不支持静态字段或复杂类型。

在 Spring Boot 中,@Value 是最常用的属性注入方式之一,用于将配置文件(如 application.properties 或 application.yml)中的值注入到 Bean 的字段中。
基本用法:读取简单属性值
使用 @Value("${key}") 即可绑定配置项。注意必须加 ${},否则会当作字面量处理。
- 配置文件中写:
app.name=myapp - Java 类中注入:
@Value("${app.name}") private String appName; - 若 key 不存在,默认会抛出
IllegalArgumentException
提供默认值避免启动失败
用冒号 : 指定默认值,当配置未定义或为空时生效。
-
@Value("${app.version:1.0.0}") private String version;→ 未配置时取"1.0.0" -
@Value("${app.debug:false}") private boolean debug;→ 支持布尔、数字等类型自动转换 - 默认值也支持 SpEL 表达式,例如:
@Value("${app.path:#{systemProperties['user.home']}/data}")
支持 SpEL 表达式做动态计算
@Value 底层基于 Spring 表达式语言(SpEL),可执行简单逻辑。
@Value("#{systemProperties['os.name'].toLowerCase().contains('win') ? 'C:/tmp' : '/tmp'}") private String tmpDir;-
@Value("#{@environment.getProperty('app.mode', 'dev')}") private String mode;→ 调用 Environment 对象 - 注意:SpEL 写法用
#{},而占位符是${},两者可嵌套,如${app.prefix:#{'dev'}}
注意事项和常见问题
@Value 只能在 Spring 管理的 Bean(即被 @Component、@Service 等注解标记的类)中生效;普通 new 出来的对象无法注入。
- 不能用于静态字段(除非配合
@PostConstruct或 setter 注入) - 不支持直接注入集合或复杂对象,需用
@ConfigurationProperties替代 - 若配置值含特殊字符(如
:、/),建议用单引号包裹:@Value("${app.url:'https://example.com'}") - IDE 可能报“Cannot resolve configuration property”,可通过添加
spring-boot-configuration-processor依赖启用提示


















