springboot配置文件之yml的語法學習


springboot配置文件(.yml/.yaml.properties)

YAML(YAML Ain't Markup Language)
YAML A Markup Language:是一個標記語言
YAML isn't Markup Language:不是一個標記語言;
標記語言:
以前的配置文件;大多都使用的是 xxxx.xml文件;

YAML:以數據為中心,比json、xml等更適合做配置文件;


springboot配置文件的加載有先后順序:

1.application.yml
2.application.yaml
3.application.properoties
后加載的會把先加載的給覆蓋掉,也就是后面的配置會覆蓋前面的配置。

1、YAML基本語法

  • 使用縮進表示層級關系
  • 縮進時不允許使用Tab鍵,只允許使用空格
  • 縮進的空格數目不重要,只要相同層級的元素左側對齊即可
  • 大小寫敏感

2、YAML 支持的三種數據結構

  • 對象:鍵值對的集合
  • 數組:一組按次序排列的值
  • 字面量:單個的、不可再分的值

yaml配置舉例

//對象(Map)的寫法
people:
	id: 123
   	age: 22
   	name: "jason"
//數組的寫法,一組連詞線(-)開頭的行,構成一個數組
-name: sprinboot yaml
 status: 2
 license: MIT
 language: java
可以任意的組合,只要符合語法規范即可。
---------------------------------
字面量
•數字、字符串、布爾、日期
•字符串
–默認不使用引號
–可以使用單引號或者雙引號,單引號會轉義特殊字符
–字符串可以寫成多行,從第二行開始,必須有一個單空格縮進。換行符會被轉為空格。

–文檔
•多個文檔用---隔開
注意:
Spring Boot使用snakeyaml 解析yml文件;https://bitbucket.org/asomov/snakeyaml/wiki/Documentation#markdown-header-yaml-syntax參考語法
#普通數據的配置(冒號之后要有空格)
name: jason
#對象的配置
person:
   name: jason
   age:22
   addr:chengdu
#對象的行內配置(行內對象冒號之后也要有空格)
person: {name: jason,age: 18,addr: chengdu}

#配置數據、集合(配置普通字符串),記得中間加空格
city:
  - beijing
  - tianjin
  - shanghai
  - chongqing
#或者是行內配置
city: [beijing,tianjin,shanghai,chongqing]

#配置對象數據,一個 - 代表一個對象
person:
  - name: tom
    age: 18
    addr: beijing
  - name: lucy
    age: 17
    addr: shanghai
#或者是行內配置
person: [{name: tom,age: 18,addr: beijing},{name: lucy,age: 17,addr: shanghai}]

#配置Map集合
map:
  key1: value1
  key2: value2

配置文件值注入到組件中

@Value@ConfigurationProperties為屬性注值區別

Feature @ConfigurationProperties @Value
Relaxed binding yes no
Meta-data suport yes no
SpEL evaluation no yes

使用@Value注解從配置文件中獲取值

@Controller
public class GetParamWithYml {
    @Value("${person.name}")//通過@Value注解來獲取yml配置文件中的值
    String name;
    @Value("${city.[0]}") //數組還是以數組下標來進行取值
    String cityname;
    @Value("${people.[0].age}")
    int age;
    @Value("${people.[0].name}") //獲取數組對象里面的值
    String peoplename;
    @Value("${hellomap.value2}") //獲取map對象的值
    String v2;
    
    @RequestMapping("/getinfo")
    @ResponseBody
    public String print() {
        System.out.println(name);
        System.out.println(age);
        System.out.println(peoplename);
        System.out.println(v2);
        return name + cityname;
    }
}
//yml配置文件中的配置
#普通對象的配置
person:
  name: jason
  age: 22
  addr: chengdu
#普通字面量的配置
name: hellojason
#配置數組,集合等信息
city:
  - beijing
  - tinajing
  - guangzhou
  - xian
#配置對象數據
people:
  - name: tom
    age: 22
  - name: lucy
    age: 23
#配置map對象
hellomap:
  value1: v1
  value2: v2
/*
總結:使用@Value從yml配置文件中獲取值,比較精准的就可以獲取到值,但是當值較多的時候,書寫麻煩,比較累贅,而且當配置文件中層級很多的時候比較麻煩。所以@Value注解適合值較少的情況使用
*/

通過@ConfigurationProperties編寫配置類進行注入

/*
 * person的配置類,從yml配置文件中獲取值
 */
@ConfigurationProperties(prefix = "person")
@Component//將這個配置類注冊為容器組件
public class PersonConf {
    String name;
    int age;
    String addr;
	setter/getter方法
}

//獲取配置文件的控制器
@RestController
public class PersonConfController {
    @Autowired//將配置類自動注入進來
    private PersonConf personConf;

    @RequestMapping("/getconfInfo")
    public String getInfo() {
        String name = personConf.getName();
        int age = personConf.getAge();
        System.out.println(age);
        return name;
    }
}
/*
使用@ConfigurationProperties注解編寫配置類從yml配置文件中獲取值,優點如下:適合於需要獲取大量的配置信息,方便復用,其他控制器需要使用直接通過注入進去就可以使用了。他也可以自成一個組件。方便其他使用。
*/

/*
*@Value和@ConfigurationProperties從配置文件中獲取值,總結:
*@Value獲取值比較精准,適合於取值比較少的情況
*@ConfigruationProperties用於編寫配置類,通過組件注入的形式獲取配置文件中的值,適合於需要大量獲取配置文件中的值的情況,比較靈活,可以實現多復用。它是作為一個組件來使用的,通過@Auotware自動注入到控制器中
*/

配置文件的占位符

  • 隨機數

    //例如
    ${random.value}、${random.int}、${random.long}
    ${random.int(10)}、${random.int[1024,65536]}
    
  • 占位符獲取之前配置的值,如果沒有可以用:指定默認值

person.last‐name=張三${random.uuid}
person.age=${random.int}
person.birth=2017/12/15
person.boss=false
person.maps.k1=v1
person.maps.k2=14
person.lists=a,b,c
person.dog.name=${person.hello:hello}_dog
person.dog.age=15

多個Profile文件

我們在主配置文件編寫的時候,文件名可以是 application-{profile}.properties/yml
默認使用application.properties的配置;使用時可以激活想使用的那個配置文件,比較靈活

yml支持多文檔塊方式

server:
port: 8081
spring:
profiles:
active: prod
‐‐‐##使用-號表示多文檔塊
server:
port: 8083
spring:
profiles: dev
‐‐‐
server:
port: 8084
spring:
profiles: prod #指定屬於哪個環境

激活指定profile
1、在配置文件中指定 spring.profiles.active=dev
2、命令行:
java -jar spring-boot-02-config-0.0.1-SNAPSHOT.jar --spring.profiles.active=dev;
可以直接在測試的時候,配置傳入命令行參數
3、虛擬機參數;
-Dspring.profiles.active=dev

配置文件的加載順序

springboot 啟動會掃描以下位置的application.properties或者application.yml文件作為Spring boot的默認配置文

–file:./config/
–file:./
–classpath:/config/
–classpath:/
優先級由高到底,高優先級的配置會覆蓋低優先級的配置;

SpringBoot會從這四個位置全部加載主配置文件;互補配置;所謂互補配置,就是說如果你的這配置文件中沒有配置 ,而在另一個配置文件配置了,那么將會綜合在一個然后生效。

可以通過spring.config.location來改變默認的配置文件位置

項目打包好以后,我們可以使用命令行參數的形式,啟動項目的時候來指定配置文件的新位置;指定配置文件和默認加載的這些配置文件共同起作用形成互補配置;例如:
java -jar spring-boot-02-config-02-0.0.1-SNAPSHOT.jar --spring.config.location=G:/application.properties


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM