SpringBoot配置文件分析

文件类型

分析源码能够知道

配置文件类型有yml、yaml、properties三种类型

YAML

SpringBoot推荐使用yaml文件,但是三者都可以;

yaml是强调以数据做为中心

经历过的配置:

xml:标记语言,格式繁琐,麻烦!

<service>
    <port>8081</port>
</service>

propeties:kry=value,太过单一,功能有限;

service.port=8081

yaml:以数据作为中心的配置文件;可以配置:普通的键值对,对象、map、数组、LIst

service:
    port: 8081

基本格式

空格严格要求,缩进严格要求!

基本语法

普通字段:

k: v
name: zhangsan

对象,Map

k:
    v1:
    v2:

person:
    name: lisi
    age: 3

# 支持行内写法
person: {name: lisi,age: 3}

数组,List

k:
    - v1
    - v2
    - v3
  
pets:
    - cat
    - dog
    - pig

# 支持行内写法
pets: {cat,dog,pig}

yaml测试实例

编写实体类

package com.star.pojo;

import lombok.Data;
import org.springframework.stereotype.Component;

@Data
@Component
public class Dog {
    private String name;
    private Integer age;
}
package com.star.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

import java.util.Date;
import java.util.List;
import java.util.Map;

/*
* SpringBoot配置类底层全部都是@ConfigurationPropeties
* 可以通过prefix前缀绑定配置文件中的yaml对象
* 这个类的所有属性,和配置类中的字段进行自动的一一对应
*
* */
@Data
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
    private String name;
    private Integer age;
    private Boolean happy;
    private Date birth;
    private Map<String,Object> maps;
    private List<Object> lists;
    private Dog dog;
}

配置文件

person:
  name: zhangsan
  age: 1
  happy: false
  birth: 2020/02/28
  maps: {k1: v1,k2: v2}
  lists:
    - code
    - music
    - game
  dog:
    name: 旺财
    age: 3

测试类

package com.star;

import com.star.pojo.Person;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class SpringbootApplicationTests {

    // 自动导入数据源
    @Autowired
    private Person person;

    @Test
    void contextLoads() {
        System.out.println(person);
    }

}

测试结果;

JSR303校验

JSR303是Java为Bean数据合法性校验所提供的一个标准规范,叫做 Bean Validation。用于对 Java Bean中的字段值进行验证。

Spring Boot中可以用@validated来校验数据,如果数据异常则会统一抛出异常,方便异常中心统一处理;

比如我们用邮箱来测试一下

@Component
@ConfigurationProperties(prefix = "person")
@Validated//数据校验
public class Person {
    @Email(message = "不符合邮箱格式!")//邮箱格式,message:报错信息
    private String email;
}

配置文件

person:
    email: 123456

测试类

    // 自动导入数据源
    @Autowired
    private Person person;

    @Test
    void contextLoads() {
        System.out.println(person);
    }

测试结果:

JSR303校验数据的格式有很多,这里只是举一个简单的例子!

可以参考源码:

也可以参考下图:

分析配置文件

我们可以在yml文件中编写这样的代码来配置服务器的端口号

server:
  port: 8081

启动项目来测试一下

为什么写这样的代码会生效呢?

接下来我们分析一下

点进自动配置类的随便一个配置类(比如HttpEncodingAutoConfiguration)

看到前缀为spring.http

我们在yml中就可以编写

spring:
  http:

在源码中都能找到对应的属性(比如:httpProperties类中的属性:encoding.cahrset....)

得出结论:

  • 配置文件中能配置的所有配置,都有对应的配置类
  • 所有的AutoConfig自动配置类,都有对应的XXXProperties类
  • 所有的XXXProperties配置类 都绑定了配置文件的固定的前缀

总之:能够配置的一切的一切都是从源码中编写;

多环境配置文件以及配置文件位置

SpringBoot中的配置文件application.yaml可以放在多个位置:(参考官网)

file:项目路径

classpath:resources

  • file:./config

  • file:./

  • classpath:./

  • classpath:/

默认配置文件的优先级:从上往下

优先级最低的,别的配置文件可以覆盖!

有多个配置环境,选定某一个配置文件;

默认是选择application.yaml

但是在application.yaml中可以选则特定的配置文件:

选择application-dev.yaml文件

spring:
  profiles:
    active: dev

选择application-test.yaml文件

spring:
  profiles:
    active: test

也可以在一个文件中有多个配置,选择某一个配置

# 默认
server:
  port: 8081
spring:
  profiles:
    active: dev/test
---
server:
  port: 8082
spring:
  profiles: dev
---
server:
  port: 8083
spring:
  profiles: test

分割线相当于多个配置文件

posted @ 2020-03-11 21:15  陌星灬  阅读(277)  评论(0编辑  收藏  举报