springboot配置文件|8月更文挑战

547 阅读3分钟

这是我参与8月更文挑战的第7天,活动详情查看:8月更文挑战

前言

springboot使用一个全局配置文件,配置文件为application.propertiesapplication.yml,一般使用yaml格式。通过配置文件可以修改springboot的默认值,实现定制化。

一、yaml格式

1.1 yaml语法

  • 使用缩进表示层级关系。
  • 缩进时不允许使用tab键,只允许使用空格。
  • 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可。
  • 大小写敏感。

1.2 三种数据结构

  • 对象:键值对集合
  • 数组:一组按次序排列的值
  • 字面量:单个的、不可再分的值

字面量:普通值(数字、字符串、布尔)
字符串默认不用加上单引号或者双引号
"":双引号,不会转移字符串里面的特殊字符,特殊字符表示本身的特殊含义。
name: "zhangsan \n lisi" ==输出=> zhangsan 换行 lisi '':单引号,会转义特殊字符,特殊字符最终作为普通字符串。 name: 'zhangsan \n lisi' ==输出=> zhangsan \n lisi

name:
  zhangsan lisi

对象、Map

# 普通写法
friends:
  lastname: zhangsan
  age: 20
  
# 行内写法 
friends: {lastname: zhangsan,age: 20}

数组(List、Set)

# 普通写法
pets:
  - cat
  - dog
  - pig
# 行内写法 
pets: {cat, dog, pig}

二、值绑定

@ConfigurationProperties(prefix="person"),将application.yml配置文件中的每一个属性值,映射到这个组件中。prefix:表示属性前缀。

@ConfigurationProperties(prefix="person")
public class Person {
  private String lastName;
  private Integer age;
  private Boolean boss;
  private Date birth;
  private Map<String,Object> maps;
  private List<Object> lists;
  private Dog dog;
  // getter setter
}
// application.yml
person:
  lastName: hello
  age: 18
  boss: false
  birth: 2021/08/07
  maps: {k1:v1,k2:v2}
  lists:
    - lisi
    - zhaoliu
  dog:
    name: 小狗
    age: 3

@Value中可以为字面量${key}从环境变量、配置文件取值、#{SpEL}支持SpEL。只有这个组件是容器中的组件时,才能实现绑定功能。

@Component
public class Person {
  @Value("${person.last-name}")
  private String lastName;
  @Value("#{11*2}")
  private Integer age;
  @Value("true")
  private Boolean boss;
  private Date birth;
  private Map<String,Object> maps;
  private List<Object> lists;
  private Dog dog;
  // getter setter
}

配置文件处理器:配置文件进行绑定有提示

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
</dependency>
@ConfigurationProperties@Value
功能批量注入配置文件中的属性单独指定
松散绑定支持不支持
SpEL不支持支持

三、导入其它配置

application.yml是属于springboot的默认配置文件,那么不可能将所有的配置写入一个文件中,导致配置文件过大。所以我们需要将一些配置写入其它文件中,那么如何使其它配置文件生效?

  • PropertySource:导入其它配置文件
  • ImportResource:导入spring的配置文件,让配置文件里面的内容生效。目前使用@Configuration@Bean
PropertySource(value = {"classpath:person.properties"})
ImportResource(value = {"locations:beans.xml"})

四、配置文件占位符

  • 可以在配置文件中引用前面配置过的属性(优先级前面配置过的这里都能用)
  • ${app.name:默认值}来指定找不到属性时的默认值
spring.name=app
app.description=${spring.name} is a Spring Boot Appilcation
  • RandomValuePropertySource:配置文件中可以使用随机数
${random.value}、${random.int}、${random.long}、${random.int(10)}、${random.int[1024,65536]}

五、Profile

Profile是spring对不同环境提供不同配置功能的支持,可以通过激活、指定参数等方式快速切换环境

1. 多profile文件形式
     - application-{profile}.properties
     eg: application-dev.properties、application-prod.properties
2. 多profile文档模式
3. 激活方式
     - 命令行 --spring.profiles.active=dev
     - 配置文件 spring.profiles.active=dev
     - jvm参数 -Dspring.profiles.active=dev

六、配置文件加载位置

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

  • file: ./config/
  • file:./
  • classpath:/config/
  • classpath:/

以上按照优先级从高到低的顺序,所有位置的文件都会被加载,高优先级配置内容会覆盖低优先级配置内容。我们也可以通过配置spring.config.location来改变默认配置。

七、外部配置加载顺序

  1. 命令行参数
  2. 来自于java:comp/env的JNDI属性
  3. java系统属性(System.getProperties())
  4. 操作系统环境变量
  5. RandomValuePropertySource配置的random.*属性值
  6. jar包外部的 application-{profile}.properties或application.yml(带spring.profile)配置文件
  7. jar包内部的 application-{profile}.properties或application.yml(带spring.profile)配置文件
  8. jar包外部的 application.properties或application.yml(不带spring.profile)配置文件
  9. jar包内部的 application.properties或application.yml(不带spring.profile)配置文件
  10. @Configuration注解类上的@PropertySource
  11. 通过SpringApplication.setDefaultProperties指定的默认属性