0%

SpringBoot-配置文件

SpringBoot-配置文件

配置文件

SpringBoot使用一个全局的配置文件,配置文件名是固定的:

  • application.properties
  • application.yml

配置文件的作用:修改SpringBoot自动配置的默认值

yml是YAML(YAML Ain't Markup Language)语言的文件,以数据为中心,比json、xml等更适合作配置文件

xml

1
2
3
<server>
<port>80</port>
</server>

yml:

1
2
server:
port: 80

YAML语法

基本语法

  • k:(空格)v:表示一对键值对(空格必须有)

  • 以空格的缩进来控制层级关系;只有是左对齐的一列数据,都是同一层级的

  • 属性和值也是大小写敏感的

值的写法

  • 字面量:普通的值(数字、字符串、布尔)

  • k: v:字面直接写(字符串默认不用加上引号;双引号不会转义字符串中的特殊字符;单引号会转义特殊字符)

  • 对象、Map(属性和值)(键值对)

    • k: v:对象还是k: v的方式,在下一行来写对象的属性和值的关系;注意缩进
    1
    2
    3
    friends:
    name:zhangsan
    age:20
    • 行内写法:
    1
    friends: {name: zhangsan,age: 20}
  • 数组(List、Set)

    • 用- 值表示数组中的一个元素

      1
      2
      3
      pets:
      - cat
      - dog
    • 行内写法

      1
      pets: [cat,dog]

配置文件值注入

  • 配置文件:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    person:
    lastName: zhangsan
    age: 18
    boss: false
    birth: 2017/12/12
    maps: {k1: v1,k2: 12}
    lists:
    - lisi
    - zhaoliu
    dog:
    name: 小狗
    age: 2

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    # idea properties配置文件默认是utf-8编码
    # 会有中文乱码,需要在setting->File Encodings将Transparent native-to-ascii勾上
    person.last-name=张三
    person.age=18
    person.birth=2020/2/7
    person.boss=false
    person.maps.k1=v1
    person.maps.k2=22
    person.lists=a,b,c
    person.dog.name=dog
    person.dog.age=5
  • JavaBean:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/**
* 将配置文件中配置的每一个属性的值,映射到这个组件中
* @ConfigurationProperties的作用:告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定
* prefix="person":配置文件中哪个下面的所有属性进行一一映射
* 只有这个组件是容器中的组件,才能使用容器提供的ConfigurationProperties功能
* @ConfigurationProperties默认是从全局配置文件中获取
*/
@Component
@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;
}
  • 可以导入配置文件处理器
1
2
3
4
5
6
<!-- 导入配置文件处理器,配置文件进行绑定就会有提示 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>

@Value获取值和@ConfigurationProperties获取值比较(2.1.6版本)

@ConfigurationProperties @Value
功能 批量注入配置文件中属性 一个个指定
松散绑定(松散语法) 支持 不支持
SpEL 不支持 支持
JSR303数据校验 支持 不支持
复杂类型封装 支持 不支持

配置文件 yml还是properties,才能获取到值

如果只是在某个业务逻辑中需要获取一下配置文件中的某项值,就用@Value

如果专门编写一个javaBean来和配置文件 进行映射就使用@ConfigurationProperties

配置文件注入值数据校验

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
@Component
@ConfigurationProperties(prefix = "person")
// @Validated:配置以验证格式,配置后,若使用@Email则验证必须是邮箱格式
@Validated
public class Person {
/**
* <bean class="Person">
* <property name="lastName" value="字面量/${key}从环境
* 变量、配置文件获取值/#{SpEL}"></property>
* </bean>
*/
// @Value("${person.last-name}")
@Email
// 必须是邮箱格式
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;
  • @PropertySource&@ImportResource

    • @PropertySource:读取指定配置文件
    1
    @PropertySource(value={"classpath:person.properties"})
    • @ImportResource:导入Spring的配置文件 ,让配置文件中的内容生效

      Spring Boot里面没有Spring配置文件 ,编写的配置文件也不能自动识别

      想让Spring配置文件生效,就必须用@ImportResource加载

    1
    @ImportResource(locations={"classpath:beans.xml"})
  • SpringBoot推荐的给容器中添加组件的方式,使用全注解的方式

    1. 配置类==Spring配置文件
    2. 使用@Bean给容器中添加组件
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    /**
    * @Configuration:指明当前类是一个配置类,替代Spring配置文件
    */
    @Configuration
    public class MyAppConfig {
    /**
    * 将方法的返回值添加到容器中,容器中这个组件默认的id就是方法名
    */
    @Bean
    public HelloService helloService(){
    return new HelloService();
    }
    }
  • 配置文件站位符

1
2
3
# 随机数
${random.value}、${random.int}、${random.long}
${random.int(10)}、${random.int[1024,65536]}
1
2
3
# 站位符获取之前配置的值,如果没有可以使用:指定默认值
person.name=tom
person.dog.name=${person.name}_dog
  • Profile

    1. 多Profile文件

      我们在主配置文件编写的时候,文件名可以是application-{profile}.properties/yml

      默认使用application.properties配置文件

    2. yml支持多文档块方式

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      server:
      port: 8081
      spring:
      profiles:
      active: dev
      ---
      server:
      port: 8082
      spring:
      profiles: dev
      ---
      server:
      port: 8083
      spring:
      profiles: prod
    3. 激活指定profile

      在配置文件中指定:spring.profiles.active=dev

      或使用命令行: --spring.profiles.active=dev,idea中配置program arguments

      或虚拟机参数:-D spring.profiles.active=dev,idea中配置VM options

  • 配置文件加载位置

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

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

    以上是按照优先级从高到低的顺序,所有位置的文件都会被加载,高优先级配置内容会覆盖低优先级配置内容,互补配置

    1
    server.context-path=/boot02 # 配置项目的访问路径

    可以通过配置spring.config.location来改变默认配置文件位置,项目打包后,可以使用命令行参数,启动项目时指定配置文件的新位置,指定配置文件和默认加载的这些配置文件共同起作用形成互补配置

  • 外部配置加载顺序

    SpringBoot也可以从以下位置加载配置:优先级从高到低,高优先级覆盖低优先级的配置,所有配置会形成互补配置

    1. 命令行参数:java -jar xxx.jar --server.port=8088 --server.context-path=/abc,多个配置间用空格分开

    2. 来自java:comp/env的JNDI属性

    3. Java系统属性(System.getProperties())

    4. 操作系统环境变量

    5. RandomValuePropertySource配置的random.*属性值

      优先加载带profile的,从外部向内部

    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指定的默认属性

  • 自动配置原理