1. 程式人生 > 其它 >4.YAML的語法

4.YAML的語法

1.基本語法   空格必須存在!
k:(空格)v 表示一對鍵值對,空格必須存在!!!
以空格的縮排來控制層級關係,左對齊的一列資料屬於同一層級:
例如:
server:
  port: 8081
  path: /hello

屬性和值都是大小寫敏感的!
2.值的寫法
1.字面量:普通得值(數字,字串,布林)
    k:(空格)v:字面量直接來寫
    字串預設不用加上單引號或者雙引號
    若加上單引號或雙引號時:
        ""雙隱號:不會轉義字串中的特殊字元;特殊字元會作為本身要表示的意思
            name: "zhangsan\nlisi" 輸出:張三 換行 李四
        ''單引號:會轉義特殊字元,特殊字元最終會作為普通的字串本身
            name: 'zhangsan\nlisi' 輸出:zhangsan\nlisi
            
2.物件、Map(屬性和值)(鍵值對)
    k:v 在下一行來寫物件的屬性和值的關係,注意縮排
        物件還是k: v的方式
    示例:
        friend:
                lastName: zhangsan
                age: 20
    第二種寫法:行內寫法
        friend: {lastName: zhangsan,age: 20}
        
    陣列(List,Set):用-(空格)值來表示陣列中的一個元素
        示例:
            pets:
                - cat
                - dog
                - pig
        陣列的行內寫法:
            pets: [cat,dog,pig]

3.yaml檔案繫結到實體類的做法

實體類的寫法:
    //1.該類並沒有寫註解
    public class Dog {
        private String name;
        private Integer age;
        get/set方法
        tostring方法
    }
    //2.person類
    /**
     * 將配置檔案中配置的每個屬性的值,對映到這個元件中
     * @ConfigurationProperties標籤告訴springboot將本類中的所有屬性和配置檔案中的相關配置進行繫結
     * prefix = "person"表示配置檔案中的哪個屬性進行一一繫結
     */
    @Component
    @ConfigurationProperties(prefix = "person")
    public class Person {
        private String name;
        private Integer age;
        private boolean boss;
        private Date birth;
    
        private Map<String, Object> map;
        private List<Object> list;
        private Dog dog;
        get/set方法
        tostring方法
    }

2.yaml檔案的寫法:注意空格和間隙
    server:
      port: 8081
      path: /hello
    
    person:
      age: 18
      boss: true
      birth: 1992/06/06
      map:
        K1: v1
        k2: v2
      list: [wmd,ld,張三]
      dog:
        name: ld
        age: 18
      name: wmd
      
3.sringboot的啟動類:
    @SpringBootApplication-->標註@SpringBootApplication註解:告訴springboot這是配置類
    public class SpringbootHelloworldQuickApplication {
        public static void main(String[] args) {
            SpringApplication.run(SpringbootHelloworldQuickApplication.class, args);
        }
    }

4.測試類:
    @RunWith(SpringRunner.class)---->使用springboot的測試類
    @org.springframework.boot.test.context.SpringBootTest
    public class SpringBootTest {
        @Autowired
        private Person person;
        @Test
        public void test01(){
            System.out.println(person.toString());
        }
    }
5.pom檔案必須匯入
    <!--匯入配置檔案處理器:配置檔案進行繫結時就會有提示-->
    <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-configuration-processor</artifactId>
       <optional>true</optional>
    </dependency>    
啟動步驟:
    1.先啟動springboot的啟動類
    2.再啟動springboot的測試類
輸出:
    Person{name='wmd', age=18, boss=true, birth=Sat Jun 06 00:00:00 CST 1992, map={K1=v1, k2=v2}, list=[wmd, ld, 張三], dog=Dog{name='ld', age=18}}
問題: 除了springboot的版本問題導致某些jar包不可用: 可以使用:2.1.3版本,該版本的springboot測試可用  
<parent>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-parent</artifactId>
   <version>2.1.3.RELEASE</version>
   <relativePath/> <!-- lookup parent from repository -->
</parent>
2.測試類的層級結構會導致錯誤!例如 上述也可以使用properties檔案進行繫結: 其他不變,prpperties檔案寫法
person.name=吳孟達
person.age=18
person.birth=1992/06/06
person.map.k1=v1
person.map..k2=v2
person.list=a,b,c
person.dog.name=劉丹
person.dog.age=18

但是輸出:
    Person{name='���ϴ�', age=18, boss=false, birth=Sat Jun 06 00:00:00 CST 1992, map={k1=v1, k2=v2}, list=[a, b, c], dog=Dog{name='����', age=18}}
發現其輸出properties輸出中文亂碼:
解決如下:
解決properties檔案亂碼如下: @ConfigurationProperties和@Value的區別
  @ConfigurationProperties @Value
功能 批量注入配置檔案中的值 一項一項注入配置檔案中的值
鬆散繫結 支援 不支援
spel 不支援 支援
JSR303資料校驗 支援 不支援
複雜型別封裝 支援 不支援
1.鬆散繫結:
    perosn中有一個屬性如下:
        private String parentName;
    application.properties檔案中該屬性值的寫法如下:
        1.-的下一位字元表示大寫
            person.parent-name=吳孟達父
        2._的下一位字元表示大寫
            person.parent_name=吳孟達父   
        3.PERSON_PARENT_NAME=吳孟達父
2.spel
    在配置檔案中不能這麼寫:
        person.age=#{12*12}
        
3.JSR303的資料校驗
    1.在@ConfigurationProperties
        @Component
        @ConfigurationProperties(prefix = "person")
        public class Person {
            @Email----->可以校驗name配置是否符合郵箱格式,不符合就報錯
            private String name;
        }
    2.在@Value標籤
         @Component
         public class Person {
             @Value("${person.name}")
             @Email----------------->不能進行校驗
             private String name;
         }
4.複雜型別
    @Value("${person.map}")------------->無法進行繫結注入
    private Map<String, Object> map;