Springboot配置文件

Springboot配置文件

Springboot 配置文件详解

Springboot配置文件支持 propertiesyml 两种文件格式

1. 自定义配置属性

application.properties

custom.name=testv1
custom.pwd=1666
custom.roles[0]=admin
custom.roles[1]=admins

CustomProperties.java

@Data
@ConfigurationProperties(prefix = "custom")
public class CustomProperties {
    private String name;
    private String pwd;
    private List<String> roles;
}

单独使用@ConfigurationProperties的话依然无法直接使用配置对象

因为它并没有被注册为SpringBean。我们可以通过三种方式来使得它生效。

  1. CustomProperties配置类中添加 @Component/@Configuration注解注入

  2. 使用@EnableConfigurationProperties注解@EnableConfigurationProperties({CustomProperties.class})注入

  3. Spring Boot 2.2.0.RELEASE提供了一个扫描注解@ConfigurationPropertiesScan可以扫描特定包下所有的被@ConfigurationProperties标记的配置类,并将它们进行IoC注入

2. 配置文件注入值数据校验

CustomProperties.java

@Data
@Validated
@EnableConfigurationProperties
@ConfigurationProperties(prefix = "custom")
public class CustomProperties {
    @Size(min = 6,max = 12,message = "name error")
    private String name;
    @Pattern(regexp = "^1.*",message = "pwd error")
    private String pwd;
    @Size(min = 1,max = 9,message = "roles error")
    private List<String> roles;
}

不符合校验规则的将在启动时报错

另:Springboot 2.3.0 及以上版本将参数校验模块抽出为一个单独项目spring-boot-starter-validation
Springboot 2.3.0 及以上版本使用配置文件注入值数据校验时应添加如下依赖

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-validation</artifactId>
    </dependency>

3. 自定义配置文件

custom.properties

custom.name=testv1
custom.pwd=1666
custom.roles[0]=admin
custom.roles[1]=admins

CustomProperties.java

@Data
@Validated
@ConfigurationProperties(prefix = "custom")
@PropertySource("classpath:custom.properties")
public class CustomProperties {
    @Size(min = 6,max = 12,message = "name error")
    private String name;
    @Pattern(regexp = "^1.*",message = "pwd error")
    private String pwd;
    @Size(min = 1,max = 9,message = "roles error")
    private List<String> roles;
}

4. 自定义属性自动提示

加入如下依赖:

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-configuration-processor</artifactId>
        <optional>true</optional>
    </dependency>

若是依旧无法自动提示,可以尝试开启IDE的Annonation Processing

5. 多配置文件

  1. 编写多配置文件时 要遵循:application-{profile}.properties/yml 格式
  2. yml配置文件多块
    server:
        port: 8888
    spring:
        profiles:
            active: dev  #指定使用哪个环境
    ---
    server:
        port: 8880
    spring:
        profiles: dev  #指定属于哪个环境
    ---
    server:
        port: 8881
    spring:
        profiles: prod #指定属于哪个环境
3. 激活指定profile
   1. 在 `application.properties` 配置文件中配置 `spring.profiles.active=dev` 指定profile
   
   2. 命令行中指定参数配置 eg: `java -jar demo.jar --spring.profiles.active=dev`
   
   3. JVM参数 eg: `-Dspring.profiles.active=dev`

6. 配置文件加载位置

springboot 启动会扫描以下位置的application.properties或者application.yml文件作为Spring boot的默认配置文件

  1. 项目根目录中config目录下
  2. 项目根目录下
  3. classpath:/config/目录下
  4. classpath

序号越小配置文件优先级别越高,同时存在propertiesyml文件的情况下,优先加载properties文件

7. 配置的生效顺序

  1. 开发者工具 Devtools 全局配置参数;
  2. 单元测试上的 @TestPropertySource 注解指定的参数;
  3. 单元测试上的 @SpringBootTest 注解指定的参数;
  4. 命令行指定的参数,如 java -jar springboot.jar --server.port=8899
  5. 命令行中的 SPRING_APPLICATION_JSONJSON 指定参数, 如 java -Dspring.application.json='{"name":"Java技术栈"}' -jar springboot.jar
  6. ServletConfig 初始化参数;
  7. ServletContext 初始化参数;
  8. JNDI参数(如 java:comp/env/spring.application.json);
  9. Java系统参数(来源:System.getProperties());
  10. 操作系统环境变量参数;
  11. RandomValuePropertySource 随机数,仅匹配:ramdom.*
  12. JAR包外面的配置文件参数(application-{profile}.properties(YAML)
  13. JAR包里面的配置文件参数(application-{profile}.properties(YAML)
  14. JAR包外面的配置文件参数(application.properties(YAML)
  15. JAR包里面的配置文件参数(application.properties(YAML)
  16. @Configuration配置文件上 @PropertySource 注解加载的参数;
  17. 默认参数(通过 SpringApplication.setDefaultProperties 指定);

Config New

首先加载内置默认的配置文件,包括application.propertiesapplication.yml

然后根据以下顺序加载外部配置文件:

a. 位于操作系统用户主目录下的config文件夹中的application.propertiesapplication.yml文件。

b. 位于jar包外部的application.propertiesapplication.yml文件。

c. 位于jar包内部的application.propertiesapplication.yml文件。

注意:如果有多个配置文件,后加载的配置文件会覆盖先加载的配置文件。

可以通过在命令行中使用--spring.config.name--spring.config.location参数来指定配置文件的名称和位置,这样可以覆盖默认的配置文件和外部配置文件的加载顺序和位置。

在多个配置文件中,相同的属性将按照以下顺序进行覆盖:

在高优先级配置文件中指定的属性将覆盖低优先级配置文件中指定的属性。

在相同优先级的配置文件中,后加载的配置文件将覆盖先加载的配置文件中指定的属性。

8. 读取特定配置

@Value("${server.port}")
private Integer port;

9. 禁用特定的配置类

@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })

本文默认启用 @ConfigurationPropertiesScan 注解

参考资料