SpringBoot(二)——配置文件

SpringBoot使用一个全局的配置文件,作用是修改项目的默认值,配置文件名是固定的;application.properties/application.yml

一、yml

yml是以数据为中心的文件,比xml、json更适合做配置文件,不是标记语言。

1.语法

  • 【key: value】表示键值对关系,冒号后面必须有一个空格;
  • 使用空格的缩进表示层级关系,空格数目不重要,只要是左对齐的一列数据,都是同一个层级的,不允许【Tab】来缩进,只能用【空格】;
  • 区分大小写;
  • 松散表示,java中对于驼峰命名法,可用原名或使用-代替驼峰,如java中的lastName属性,在yml中使用lastName或 last-name都可正确映射;
  • 只能单行注释#

2.赋值

(1)字面量:字符串默认不用加引号,加双引号特殊字符不会转义,加单引号会转义

(2)日期:value以【/】分开,例如2020/06/21

(3)数组:list和set中用【-】表示其中一个元素

(4)行内写法:下一级用花括号{}围起来,每个【key: value】之间用【,】隔开

(5)POJO类注入:

加上@Component注解表示是Spring组件,映射

加上@ConfigurationProperties告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定,需要在pom.xml里加上依赖包spring-boot-configuration-processor(配置文件处理器)。需要用前缀(prefix = "person")指定全局配置文件下的person下层的属性进行赋值,删掉后不能成功赋值。

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

对于该Person类与对应的yml配置文件

@Component
@ConfigurationProperties(prefix = "person")
@Data
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; }

application.yml文件

person:
    last-name: 守林鸟
    age: 22
    boss: false
    birth: 1998/11/02
    maps: {country: 中国,city: 广州}
    lists:
      - 乒乓
      - 羽毛
      - 骑行
    dog:
        name: 二哈
        age: 3
#这是注释

在测试类里测试输出

import com.lyj.demo.bean.Person;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.junit.jupiter.api.Test;

@SpringBootTest
class Test01ApplicationTests {

    @Autowired
    Person person;

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

在实际开发中,数据基本都是从web层传入,而不是在配置文件中写死,配置文件一般用于连接数据库等可以写死的信息,这里只是记录注入的语法规范。

二、properties

这是一种属性文件,也是以key-value的形式存值

(1)注释#

(2)赋值以【.】的形式,也需要在Person类上面加上@ConfigurationProperties(prefix = "person")

#单行注释
person.last-name=霸王别鸡
person.age=23
person.boss=false
person.birth=1998/11/02
person.maps.country=中国
person.maps.city=广州
person.lists[0]=乒乓
person.lists[1]=羽毛
person.lists[2]=打码
person.dog.name=二哈
person.dog.age=3 #后续要比对

(3)idea乱码问题

File->Settings...->Editor->File Encodings,默认编码格式改为UTF-8,勾选后面的【Transparent native-to-ascii conversion】。

(4)与yml一起加载

如果两个配置文件同时存在,先加载yml文件,再加载properties文件,二者都有的属性yml的会被覆盖,如果仅yml有的属性就不会被覆盖,可以理解为properties优先级更高,互补配置

(5)properties与yml文件内容相互转换的网址

https://www.toyaml.com/index.html

(6)@Value获取值和@ConfigurationProperties获取值比较

  • 松散语法是指lastName可以以last-name的形式来赋值
  • 校验需要加上@Validated注解,校验格式,例如属性有@Email注解时,赋值需要是合法邮箱
  • SpEL是指赋值#{11*2}这样的表达式直接获得结果22

(7)其他配置方法

@PropertySource:防止全局application.properties配置文件巨大,再开一个person.properties配置文件来写东西

@PropertySource(value = {"classpath:person.properties"})
@Component
@ConfigurationProperties(prefix = "person")
@Data
public class Person {

即使它看起来是灰色的,但也是可以识别的

(8)、poperties占位符

  • ${random.value}
  • ${random.uuid}
  • ${random.int(10)}
  • ${random.int([min],[max])}
  • ${random.long}

如果前面有一个属性,例如person.last-name,写了但没有赋值(没有接上=),后面用${person.last-name}获取的时候当作空字符串

如果属性不存在例如person.last-nameeee,以前会报错,现在是直接把整个【${person.last-name}】当作字符串拼接;不想要这样的话就加上冒号写一个默认值

person.dog.name=${person.last-nameeee}dog
#输出:${person.last-nameeee}dog
person.dog.name=${person.last-nameeee:霸王别鸡的}dog
#输出:霸王别鸡的dog

三、Profile

主配置文件可以写多个,适应各种不同的环境需要,默认的文件是application.properties,其他的命名为application-{profile}.properties/yml

1.properties写法

例如自定义application-dev.properties和application-prod.properties文件,在默认文件中加上这么一句话就可以启动其他的配置文件

spring.profiles.active=dev

2.yml写法

用文档分块[---]的形式当作几个不同的文件,在最上面一个写上激活方式

server:
  port: 8081
spring:
  profiles:
    active: dev #激活
person:
  last-name: 默认

---

server:
  port: 8082
spring:
  profiles: dev

person:
  last-name: dev环境
---

server:
  port: 8084
spring:
  profiles: prod

person:
  last-name: prod环境

dev指开发环境,prod或pro指生产环境,test指测试环境,pre指预发布环境

 

原文地址:https://www.cnblogs.com/shoulinniao/p/13174669.html