首页 > 编程笔记

Spring Boot配置文件

Spring Boot 的自动配置方式让配置文件使用起来更加方便,直接配置默认属性就可以完成对其他模块的集成。

默认配置文件

Spring Boot 默认支持两种配置文件:
  1. bootstrap( .yml 或 .properties 格式)文件。
  2. application( .yml 或 .properties 格式)文件。

从加载顺序来看,bootstrap 文件是优先于 application 文件的。bootstrap 文件是父应用程序上下文加载,用于程序启动的引导工作,并且 bootstrap 文件可以从额外的资源来加载配置信息。

从应用场景来看,bootstrap 文件可以配置一些系统级别的属性,这些属性的特征基本不会变,而 application 文件可以通过环境的不同分成多个文件。这两个文件共用一个环境,为 Spring Boot 应用程序提供配置属性。

可以看到,Spring Boot 的配置文件有 .yml 与 .properties 两种扩展名称。YAML 格式的文件可以更方便地定义层次配置数据,数据结构层次清晰明了,配置简单易读。本文的示例将会采用 YAML 格式的文件来配置数据。

多环境配置

在进行应用开发时,环境会分为开发环境(dev)、测试环境(test)和线上环境(prod),对应的会有多个配置文件,如 application-dev.yml、application-test.yml 和 application-prod.yml。

Spring Boot 采用 spring.profiles.active 属性变量来指定具体的配置文件,如 spring.profiles.active=test,应用启动加载的文件是 application-test.yml。

同样,也可以在一个 application.yml 文件中通过 spring.profiles 属性配置不同环境的属性值。示例代码如下:

server:
    address: 192.168.1.100
---
spring:
    profiles: dev
server:
    address: 127.0.0.1
---
spring:
    profiles: prod
server:
    address: 192.168.1.120

上面的这个例子中,如果 dev 配置被指定,则 server.address 的属性值为 127.0.0.1。同样,如果 prod 配置被指定,则 server.address 的属性值为192.168.1.120。如果 dev 和 prod 配置都没有被指定,则 server.address 的属性值为 192.168.1.100。

配置注解

Spring Boot 提供了 @ConfigurationProperties 和 @Value 等注解,可以轻松地获取配置文件的属性值。具体示例代码如下:

my:
   servers:
       -dev.example.com
       -another.example.com
   name: www.weixueyuan.net

上面是一个 YAML 格式的配置文件,可以通过 @ConfigurationProperties 注解获取配置的属性值。示例代码如下:
@Data
@Component
@ConfigurationProperties(prefix="my")
public class ConfigProperties {
    //值:dev.example.com 、another.example.com
    private List<String> servers = new ArrayList<String>();
    private String name; //值:www.weixueyuan.net
}
通过 @EnableConfigurationProperties 注解可以引入 ConfigProperties 类。示例代码如下:
@Configuration(proxyBeanMethods = false)
@EnableConfigurationProperties(ConfigProperties.class)
public class MyConfiguration {
}
通过 @Validated 注解可以对配置文件中的属性值进行校验。示例代码如下:
@ConfigurationProperties(prefix="my")
@Validated
public class ConfigProperties {
    private List<String> servers = new ArrayList<String>();
    @NotNull   //不为空
    private String name;
}
通过 @Value("${property}") 注解方式可以直接获取单个属性值。示例代码如下:
@component
public class ConfigService {
    @Value("${my.nam}")  //www.weixueyuan.net
    private String name;
}
Spring Boot 使用 @Configuration 注解完成自动配置,同时也提供了很多 @Conditional 注解,指定在哪些条件下才能自动加载配置,如果不满足条件,则不加载。@Conditional 注解的类型如表2所示。

表2 @Conditional注解的类型
类  型 说  明
@ConditionalOnClass 在类路径下有指定的类时加载
@ConditionalOnMissingClass 在类路径下没有指定的类时加载
@ConditionalOnBean 在容器中有指定的Bean时加载
@ConditionalOnMissingBean 在容器中没有指定的Bean时加载
@ConditionalOnProperty 配置文件有某个指定的属性时加载
@ConditionalOnResource 有指定的资源时加载
@ConditionalOnWebApplication 当应用是Web应用时加载
@ConditionalOnExpression 满足某表达式时加载

优秀文章