SpringBoot读取外部配置文件高级技巧

190 阅读1分钟

结构化配置 @ConfigurationProperties + @EnableConfigurationProperties

定义配置类

  1. 通过ConstructorBinding + 构造函数注入
  2. 只暴露了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;