@value注解用于将外部配置(如环境变量、配置文件)直接注入spring bean字段,支持${key}占位符和${key:default}默认值语法,需确保spring容器管理bean生命周期,不适用于静态字段或构造器中直接使用。

环境参数通过直接属性注入方式让容器读取,核心在于将外部配置(如系统环境变量、配置文件)映射为 Spring Bean 的字段值,无需手动调用 Environment 接口或写配置类。
使用 @Value 注入环境变量
Spring 支持通过 @Value 直接绑定环境变量或配置项到 Bean 字段,支持占位符语法 ${key} 和默认值 ${key:default}。
- 确保对应环境变量已设置(如 Linux 下
export DB_URL=jdbc:h2:mem:test) - 在组件中声明字段并标注:
@Value("${DB_URL:jdbc:h2:mem:dev}")private String dbUrl; - 若变量名含特殊字符(如
SPRING_PROFILES_ACTIVE),可直接引用,无需转驼峰
启用属性源自动加载
Spring Boot 默认加载 application.properties、application.yml 及系统环境变量,但若需额外来源(如自定义 .env 文件),需注册 PropertySource 或使用 @PropertySource。
- 在主配置类上添加:
@PropertySource("classpath:custom.properties") - 注意:该注解不支持 YAML;YAML 需通过
spring.config.import或配置文件合并方式引入 - 命令行参数、JVM 系统属性优先级高于配置文件,可用于覆盖测试环境值
结合 @ConfigurationProperties 批量绑定
当多个相关属性需统一管理时,推荐使用类型安全的 @ConfigurationProperties,比分散的 @Value 更易维护。
- 定义 POJO 并标注前缀:
@ConfigurationProperties(prefix = "app.datasource") - 对应配置项如:
app.datasource.url=jdbc:mysql://localhost:3306/testapp.datasource.username=root - 需在启动类或配置类上启用:
@EnableConfigurationProperties(DataSourceProperties.class) - 支持松散绑定(
app.datasource.max-pool-size→maxPoolSize)和校验(@Valid)
避免常见陷阱
直接注入看似简单,但容易因加载时机、作用域或类型转换出错。
-
@Value在构造器中不可用(字段尚未注入),应改用构造器参数 +@Value或使用@RequiredArgsConstructor+@Value字段 - 注入非字符串类型(如
int、boolean)时,若环境变量为空或格式错误会抛IllegalArgumentException - 静态字段无法被 Spring 注入,
@Value必须用于实例变量或 setter 方法 - Profile 激活后,同名属性以激活 profile 的配置为准,注意
application-dev.properties覆盖逻辑











