结构化配置 @ConfigurationProperties + @EnableConfigurationProperties
定义配置类
- 通过ConstructorBinding + 构造函数注入
- 只暴露了getter。防止修改
@ConfigurationProperties("config.test")
public class ConfigTest {
private String name;
private String age;
private List<Hobby> hobby = new ArrayList<>();
private Map<String,String> programming = new HashMap<>();
@ConstructorBinding
public ConfigTest(String name, String age, List<Hobby> hobby, Map<String, String> programming) {
this.name = name;
this.age = age;
this.hobby = hobby;
this.programming = programming;
}
public String getName() {
return name;
}
public String getAge() {
return age;
}
public List<Hobby> getHobby() {
return hobby;
}
public Map<String, String> getProgramming() {
return programming;
}
public static class Hobby{
private String name;
private int time;
public Hobby(String name, int time) {
this.name = name;
this.time = time;
}
public String getName() {
return name;
}
public int getTime() {
return time;
}
}
}
启用自动配置
通过在Component上添加@EnableConfigurationProperties注解启动配置
@SpringBootApplication
@EnableConfigurationProperties(ConfigTest.class)
public class SpringBootDemo01Application{
public static void main(String[] args) {
SpringApplication.run(SpringBootDemo01Application.class, args);
}
}
配置
config.test.name=test
config.test.age=18
config.test.hobby[0].name=football
config.test.hobby[0].time=18
config.test.programming.first=go
config.test.programming.second=java
config.test.programming.third=python
按照环境使用配置
启动时指定环境
在命令行加上参数指定环境
-Dspring.profiles.active=test。也可以通过环境maven指定
配置环境
└── resources
├── application.properties
├── db
│ ├── prod.properties
│ └── test.properties
└── service
├── prod.properties
└── test.properties
指定每个环境下使用的配置文件
通过
spring.config.import来导入配置文件
#---
spring.config.activate.on-profile=prod
spring.config.import=classpath:db/prod.properties,classpath:service/prod.properties
#---
spring.config.activate.on-profile=test
spring.config.import=classpath:db/test.properties,classpath:service/test.properties
使用配置
@Value("${service.name}")
private String serviceName;
@Value("${db.name}")
private String dbName;