SpringBoot自定义配置属性与@Value
SpringBoot 支持多种方式读取自定义配置。
@Value注解
基础用法
Java
@Service
public class MyService {
@Value("${app.name}")
private String appName;
@Value("${app.timeout:3000}") // 默认值
private int timeout;
@Value("${app.enabled:true}")
private boolean enabled;
}
配置文件
YAML
app:
name: my-application
timeout: 5000
enabled: true
@Value高级用法
SpEL表达式
Java
@Value("#{'${app.servers}'.split(',')}")
private List<String> servers;
@Value("#{systemProperties['user.home']}")
private String userHome;
@Value("#{T(java.lang.Math).random() * 100}")
private double randomValue;
配置示例
YAML
app:
servers: server1,server2,server3
@ConfigurationProperties
定义配置类
Java
@Data
@ConfigurationProperties(prefix = "app")
public class AppConfig {
private String name;
private int timeout;
private boolean enabled;
private List<String> servers;
private Map<String, String> features;
}
启用配置绑定
Java
@SpringBootApplication
@EnableConfigurationProperties(AppConfig.class)
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
配置文件
YAML
app:
name: my-app
timeout: 5000
enabled: true
servers:
- server1
- server2
features:
cache: redis
auth: jwt
使用配置类
Java
@Service
public class MyService {
@Autowired
private AppConfig appConfig;
public void process() {
String name = appConfig.getName();
List<String> servers = appConfig.getServers();
}
}
嵌套配置对象
Java
@Data
@ConfigurationProperties(prefix = "app")
public class AppConfig {
private String name;
private Database database;
private Cache cache;
@Data
public static class Database {
private String url;
private String username;
private int maxPoolSize;
}
@Data
public static class Cache {
private String type;
private int ttl;
}
}
YAML
app:
name: my-app
database:
url: jdbc:mysql://localhost/db
username: root
max-pool-size: 20
cache:
type: redis
ttl: 3600
@Value vs @ConfigurationProperties
| 特性 | @Value | @ConfigurationProperties |
|---|---|---|
| 松散绑定 | 不支持 | 支持 |
| SpEL | 支持 | 不支持 |
| 复杂对象 | 不支持 | 支持 |
| 校验 | 不支持 | 支持 |
| 元数据提示 | 不支持 | 支持 |
配置校验
Java
@Data
@ConfigurationProperties(prefix = "app")
@Validated
public class AppConfig {
@NotBlank
private String name;
@Min(1000)
@Max(10000)
private int timeout;
@Email
private String adminEmail;
}
松散绑定示例
YAML
# 以下写法都能绑定到 myPropertyName
app:
my-property-name: value1
my-propertyName: value2
myPropertyName: value3
MY_PROPERTY_NAME: value4
配置文件加载顺序
Java
@Service
public class MyService {
// 优先级:命令行 > 环境变量 > yml > properties
@Value("${app.name}")
private String appName;
}
建议复杂配置使用@ConfigurationProperties,简单配置使用@Value。
要点总结
- @Value读取单个配置,支持默认值
- @ConfigurationProperties批量绑定配置
- 松散绑定支持多种命名格式
- @Validated支持配置校验
- 嵌套对象实现复杂配置结构
📝 发现内容有误?点击此处直接编辑