在 Spring Boot 项目中通常需要从 application.properties
或 application.yml
配置文件中读取配置信息。@Value
注解提供了一种简单的方式来将配置值注入到 Spring 组件中。
@Value
是 Spring 提供的一个注解,用于从配置文件或其他来源(如系统环境变量、SpEL 表达式)中读取值并注入到 Bean 的字段或方法参数中。其基本语法如下:
@Value("${property.key}")
private String propertyValue;
application.properties
或 application.yml
配置值application.properties
app.name=Spring Boot Demo
app.version=1.0.0
application.yml
app:
name: Spring Boot Demo
version: 1.0.0
@Component
public class AppConfig {
@Value("${app.name}")
private String appName;
@Value("${app.version}")
private String appVersion;
public void printConfig() {
System.out.println("Application Name: " + appName);
System.out.println("Application Version: " + appVersion);
}
}
Application Name: Spring Boot Demo
Application Version: 1.0.0
@Value
设置默认值如果配置文件中未定义某个属性,则 @Value
注解可以提供一个默认值。默认值的语法是 :${defaultValue}
:
@Component
public class DefaultValueExample {
@Value("${app.author:Unknown Author}")
private String author;
public void printAuthor() {
System.out.println("Application Author: " + author);
}
}
如果 application.properties
或 application.yml
中未配置 app.author
,则输出:
Application Author: Unknown Author
@Value
也可以用于读取系统环境变量或 -D
方式传递的 JVM 运行参数:
@Component
public class EnvConfig {
@Value("${JAVA_HOME}")
private String javaHome;
@Value("${user.name}")
private String userName;
public void printSystemProperties() {
System.out.println("JAVA_HOME: " + javaHome);
System.out.println("User Name: " + userName);
}
}
如果运行环境变量设置了 JAVA_HOME=/usr/lib/jvm/java-11-openjdk
,则输出:
JAVA_HOME: /usr/lib/jvm/java-11-openjdk
User Name: admin
@Value
注解支持 Spring 表达式语言(SpEL),可用于动态计算值。
@Component
public class SpELExample {
@Value("#{2 * 5}")
private int result;
public void printResult() {
System.out.println("Result: " + result);
}
}
输出:
Result: 10
@Component
public class AnotherBean {
private String message = "Hello from AnotherBean";
public String getMessage() {
return message;
}
}
@Component
public class BeanReferenceExample {
@Autowired
private AnotherBean anotherBean;
@Value("#{anotherBean.message}")
private String messageFromAnotherBean;
public void printMessage() {
System.out.println(messageFromAnotherBean);
}
}
输出:
Hello from AnotherBean
app.servers=192.168.1.1,192.168.1.2,192.168.1.3
@Component
public class ArrayConfig {
@Value("${app.servers}")
private String[] servers;
public void printServers() {
System.out.println(Arrays.toString(servers));
}
}
输出:
[192.168.1.1, 192.168.1.2, 192.168.1.3]
List
@Component
public class ListConfig {
@Value("#{'${app.servers}'.split(',')}")
private List<String> serverList;
public void printServerList() {
System.out.println(serverList);
}
}
输出:
[192.168.1.1, 192.168.1.2, 192.168.1.3]
Map
app.db.config=username:admin,password:123456,url:jdbc:mysql://localhost:3306/test
@Component
public class MapConfig {
@Value("#{${app.db.config}}")
private Map<String, String> dbConfig;
public void printDbConfig() {
System.out.println(dbConfig);
}
}
输出:
{username=admin, password=123456, url=jdbc:mysql://localhost:3306/test}
@ConfigurationProperties
对比特性 | @Value |
@ConfigurationProperties |
---|---|---|
作用范围 | 适用于单个值注入 | 适用于整个配置对象映射 |
支持的数据类型 | 主要用于 String、基本类型、数组 | 可绑定复杂对象(如 List、Map、自定义对象) |
代码简洁性 | 适用于少量配置参数 | 适用于大量配置参数 |
是否支持 SpEL | 支持 | 不支持 |
示例:@ConfigurationProperties
用法
app.name=Spring Boot Demo
app.version=1.0.0
@Configuration
@ConfigurationProperties(prefix = "app")
public class AppProperties {
private String name;
private String version;
// getter & setter
}
@Value
注解用于将配置文件中的值注入到 Spring 组件中。@Value
可用于读取 application.properties
或 application.yml
中的值,并支持默认值。@Value
还能用于读取环境变量、JVM 运行参数和 SpEL 表达式。@Value
可以解析数组、List、Map 等数据结构。@ConfigurationProperties
,而 @Value
适用于简单值注入。