狂った神の元の記事のアドレスからメモをコピーする
yaml文法学習
構成ファイル
SpringBootはグローバル構成ファイルを使用し、構成ファイル名は固定されています(次の2つの方法で)
-
application.properties
文法構造:key = value
-
application.yml
構文構造:キー:スペース値
構成ファイルの役割:SpringBootは下部で自動的に構成するため、SpringBoot自動構成のデフォルト値を変更します。
たとえば、Tomcatがデフォルトで開始するポート番号を構成ファイルで変更できます。テストしてください!
server.port=8081
yamlの概要
YAMLは、「YAMLはマークアップ言語ではありません」の再帰的頭字語です(YAMLはマークアップ言語ではありません)。この言語を開発するとき、YAMLは実際には次のことを意味します:「YetAnother MarkupLanguage」(まだマークアップ言語)
この言語はデータ中心であり、マークアップ言語ではありません。
以前の構成ファイルのほとんどはxmlを使用して構成されています。たとえば、単純なポート構成では、yamlとxmlの
従来のxml構成を比較してみましょう。
<server>
<port>8081<port>
</server>
yaml構成:
server:
prot: 8080
yamlの基本的な文法
注:文法は厳格です!
1.スペースは省略できません
2.左側に配置されたデータの列が同じレベルにある限り、インデントを使用して階層関係を制御します。
3.属性と値の場合は非常に敏感です。
リテラル:通常の値[数値、ブール値、文字列]
リテラルはすぐ後ろに書くことができ、文字列はデフォルトで二重引用符または一重引用符で囲む必要はありません。
k:v
注:
""二重引用符は文字列内の特殊文字をエスケープせず、特殊文字は表現したいものになります。
例:名前: "kuang \ n shen"出力:kuan、改行shen
''一重引用符は特殊文字をエスケープし、特殊文字は最終的に通常の文字のように出力されます
例:名前: 'kuang \ n shen'出力:kuang \ n shen
オブジェクト、マップ(キーと値のペア)
#オブジェクト、マップ形式
k:
v1:
v2:
インデントに注意しながら、次の行にオブジェクトのプロパティと価値のある関係を記述します。例:
student:
name: qinjiang
age: 3
インラインライティング
学生:{名前:qinjiang、年齢:3}
配列(リスト、セット)
配列内の要素を表すために-valueを使用します。次に例を示します。
pets:
- cat
- dog
- pig
インラインライティング
pets: [cat,dog,pig]
SpringBootのデフォルトのポート番号を変更します
構成ファイルにポート番号のパラメーターを追加すると、ポートを切り替えることができます。
server:
port: 8082
構成ファイルを挿入します
yamlファイルのより強力な部分は、一致する値をエンティティクラスに直接挿入できることです!
yamlインジェクション設定ファイル
1. springbootプロジェクトのresourcesディレクトリに新しいファイルapplication.ymlを作成して、
コンテンツを書き込みます
person:
name: zhouyi
age: 20
happy: false
birth: 2021/3/13
maps: {k1: v1,k2: v2}
lists:
- code
- music
- girl
dog:
name: 旺财
age: 3
2.エンティティクラスPeopleを記述し、それをクラスに追加します。
@Component
@ConfigurationProperties(prefix = "person")
package com.zhou.pojo;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.Date;
import java.util.List;
import java.util.Map;
@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;
.....
テストクラスで
package com.zhou;
import com.zhou.pojo.Dog;
import com.zhou.pojo.Person;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class Springboot02ConfigsApplicationTests {
@Autowired
private Dog dog;
@Autowired
private Person person;
@Test
void contextLoads() {
System.out.println(dog);
System.out.println(person);
}
}
操作の結果は次のとおりです。
プロパティファイルを使用して、オブジェクトのプロパティをアセンブルします
1.新しいdog.propertiesファイルを作成します
2.新しい犬エンティティクラスを作成します
package com.zhou.pojo;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;
@Component
//加载指定的配置文件
@PropertySource(value = "classpath:dog.properties")
public class Dog {
@Value("${name}")
private String name;
@Value("${age}")
private Integer age;
3.テスト
実行結果を実行します。
比較概要
@Valueは使い勝手が良くありません!各プロパティに個別にアノテーションを付けて値を割り当てる必要がありますが、これはさらに面倒です。関数比較チャート
1を見てみましょう。@ ConfigurationPropertiesは1回だけ書き込む必要があり、@ Valueは各フィールドに追加する必要があります。
2.緩いバインディング:これはどういう意味ですか?たとえば、私のymlに書かれている姓はlastNameと同じです-続く文字はデフォルトで大文字になっています。これは緩い製本です。それをテストすることができます
3. JSR303データ検証、これは、データの合法性を保証するために、フィールドにフィルター検証のレイヤーを追加できることです。
4.複合型のカプセル化オブジェクトはymlにカプセル化できますが、値はサポートされていません
結論として:
構成ymlと構成プロパティの両方が値を取得できます。ymlを強くお勧めします。
私たちがビジネスをしていて、構成ファイルで特定の値を取得するだけでよい場合は、@ valueを使用できます。
構成ファイルと1対1でマップするJavaBeanを特別に作成したと言う場合は、直接@configurationPropertiesを使用することを躊躇しないでください!