4.YAML的語法
阿新 • • 發佈:2022-05-09
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檔案繫結到實體類的做法
問題: 除了springboot的版本問題導致某些jar包不可用: 可以使用:2.1.3版本,該版本的springboot測試可用實體類的寫法: //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}}
2.測試類的層級結構會導致錯誤!例如 上述也可以使用properties檔案進行繫結: 其他不變,prpperties檔案寫法<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.3.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent>
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;