@Value
在 Java 中,@Value
是 Spring 框架提供的一个注解,主要用于从 外部配置(如 properties 文件、YAML 文件、环境变量等)中注入值到 Spring Bean 的字段、方法参数或构造函数参数中。
一、基本用法
1. 从 application.properties
或 application.yml
注入值
假设你有如下配置文件(比如 application.properties
):
app.name=MyApplication
app.version=1.0.0
你可以在一个 Spring 管理的 Bean 中这样使用 @Value
注入这些值:
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;@Component
public class MyAppConfig {@Value("${app.name}")private String appName;@Value("${app.version}")private String appVersion;public void printConfig() {System.out.println("App Name: " + appName);System.out.println("App Version: " + appVersion);}
}
@Value("${app.name}")
表示从配置中读取 key 为app.name
的值,并注入到该字段。- 如果配置中没有对应的 key,启动时可能会报错,除非你提供了默认值。
2. 提供默认值
如果某个配置项可能不存在,你可以为 @Value
设置一个默认值,语法如下:
@Value("${some.key:defaultValue}")
private String someValue;
示例:
@Value("${app.description:这是一个默认描述}")
private String appDescription;
如果配置中没有 app.description
,则 appDescription
会被赋值为 "这是一个默认描述"
。
二、注入非字符串类型
@Value
支持自动类型转换,所以你也可以注入 int、boolean、long 等类型:
server.port=8080
feature.enabled=true
max.retry=3
@Value("${server.port}")
private int serverPort;@Value("${feature.enabled}")
private boolean featureEnabled;@Value("${max.retry}")
private int maxRetry;
Spring 会自动将这些字符串配置值转换为对应的基本数据类型或包装类。
三、注入表达式(SpEL)
@Value
还支持 Spring Expression Language (SpEL),允许你注入更复杂的表达式,比如调用静态方法、系统属性、环境变量等。
示例:
// 注入系统属性 user.home
@Value("#{systemProperties['user.home']}")
private String userHome;// 注入当前环境变量中的 PATH(注意写法)
@Value("#{systemEnvironment['PATH']}")
private String pathEnv;// 注入一个固定值,或者调用静态方法(需要额外处理,一般不直接在@Value里调用静态方法)
@Value("#{T(java.lang.Math).random() * 100.0}")
private double randomValue;
说明:
#{...}
表示 SpEL 表达式。T(全限定类名)
用于引用静态类,比如T(java.lang.Math)
。
四、使用场景总结
场景 | 示例 |
---|---|
注入配置文件中的字符串 | @Value("${app.name}") |
注入数字、布尔等类型 | @Value("${server.port}") → int |
提供默认值 | @Value("${optional.key:default}") |
注入系统属性 | @Value("#{systemProperties['user.dir']}") |
注入环境变量 | @Value("#{systemEnvironment['PATH']}") |
注入 SpEL 表达式结果 | @Value("#{T(java.lang.Math).random()}") |
五、注意事项
@Value
作用于 Spring 管理的 Bean 上才有效,比如被@Component
,@Service
,@Controller
,@Configuration
等注解标记的类,或者通过@Bean
方法定义的实例。不要滥用
@Value
:在大型项目中,推荐使用@ConfigurationProperties
来进行类型安全、结构化的配置绑定,尤其是当你有一组相关的配置项时。配置文件要能被 Spring 扫描到,比如
application.properties
或application.yml
默认放在src/main/resources
下即可。
六、与 @ConfigurationProperties 对比
特性 | @Value | @ConfigurationProperties |
---|---|---|
用法 | 单个属性注入 | 批量结构化属性绑定 |
类型安全 | 弱(需手动转换) | 强(可绑定到对象属性) |
适合场景 | 少量零散配置 | 大量相关配置项 |
支持 SpEL | 是 | 否 |
配置提示(IDE) | 无 | 有(结合 meta-data) |
七、小结
@Value
是 Spring 提供的用于注入配置值的注解,非常灵活,支持字符串、数字、布尔值、SpEL 表达式等。- 通常用于简单的、单个的配置项注入。
- 对于复杂的、一组相关的配置,建议使用
@ConfigurationProperties
。
!