[Spring Boot] 設定ファイル YML: 開始と使用
1.YML設定ファイルの概要
YML ファイル形式は、YAML (YAML Aint Markup Language) で記述されたファイル形式です。YAML は、コンピュータで認識でき、人間が読みやすく、スクリプト言語と対話しやすく、直感的なデータシリアル化形式です。サポートされている YAML ライブラリは、C/C++、Ruby、Python、Java、Perl、C#、PHP などのさまざまなプログラミング言語プログラムをインポートします。YML ファイルはデータ中心であり、従来の xml 方式よりも簡潔ですが、データを記述する方法は xml よりも若干難しくなります。
YML ファイルの拡張子は .yml または .yaml で、拡張子は異なりますが、両者に本質的な違いはありません。
2. YML設定ファイルの構文
- 通常のデータ(単一のキー値)を構成する
構文:キー: 値
例:キーとコロンの間にはスペースはありませんが、値とスペースの間には英半角スペースが必要です。
# 配置普通数据
name: chenfeilin
- オブジェクト データの構成 (オブジェクトには複数の属性と対応する値が含まれます)
文法1:
key:
key1: value1
key2: value2
例: key1 の前のスペースの数に制限はありません。YML 構文では、同じインデントは同じレベルを表しますが、通常、デフォルトは 2 つのスペースです。インデントの量も読み取りに影響します。
# 配置对象数据1
person:
name: feilin
age: 24
文法2:
キー: {キー1: 値1,キー2: 値2}
例:
# 配置对象数据2
student: {
name: stu,age: 77}
-
地図データの設定
構文は上記と同じで、上記のデータ構造はオブジェクトまたはマップ コレクションとして解析できます。ここではこれ以上の例はありません。 -
配列(List、Set)データの設定
文法1:
キー:
- 値1
- 値2
例: value1 と - の間にスペースがあります
# 配置数组(List、Set)数据1
mylist:
- chenfeilin
- 777
- nagasawa_masami
文法2:
キー: [値1,値2]
例:
# 配置数组(List、Set)数据2
city: [beijing,tianjin,shanghai,chongqing]
コレクション内の要素がオブジェクトの形式である場合:
# 集合中的元素是对象形式
users:
- name: zhangsan
age: 18
- name: lisi
age: 28
- name: wangwu
age: 38
3. @Value に注釈を付けて、構成ファイルと構成クラスのプロパティをマップします。
@Value アノテーションは、構成ファイル内の単一のキー値をマップするために使用されます。
コントローラーを作成し、構成ファイル内の値を受け取るためのいくつかのプロパティを定義します。
@RestController
public class TestController {
@Value("${name}")
private String name;
@Value("${person.name}")
private String personName;
@RequestMapping(value = "/getValue")
public String TestMapping() {
System.out.println("name: " + name);
System.out.println("personName: " + personName);
return "request OK";
}
}
プロジェクトを開始し、http://localhost:8080/getValue に
正常にアクセスします。次にコンソールを確認します。
4. @ConfigurationProperties 構成マッピングに注釈を付ける
注釈 @ConfigurationProperties を使用して、構成ファイル内のオブジェクト値の Java 構成オブジェクトへのマッピングを完了します。
具体的な使用方法は、 @ConfigurationProperties (prefix = "設定ファイル内のキーのプレフィックス") アノテーションを付けることで、設定ファイル内の設定をエンティティに自動的にマッピングすることです。たとえば、設定ファイル内の
person
person:
name: feilin
age: 24
コードを見てみましょう:
// 先提供一个载体,用来作为接收对象
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
private String name;
private int age;
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
// 然后修改并获取到person
@RestController
public class TestController {
@Value("${name}")
private String name;
@Autowired
private Person person;
@Value("${person.name}")
private String personName;
@RequestMapping(value = "/getValue")
public String TestMapping() {
System.out.println("name: " + name);
System.out.println("person: " + person);
System.out.println("personName: " + personName);
return "request OK";
}
}
コンソール出力に問題はありません:
person クラスは get メソッドと set メソッドを提供する必要があることに注意してください。そうでない場合、設定ファイルの値は取得されません。このアノテーションは、set メソッドを通じて対応する属性に値を割り当てます。 。@value アノテーションを使用する場合、set メソッドは必要ありません。
コレクションや配列型などの他の型も設定できるので、設定ファイルを変更しましょう。
person:
name: feilin
age: 24
mylist:
- chenfeilin
- 777
- nagasawa_masami
address: [beijing,tianjin,shanghai,chongqing]
girlFriends:
- girlName: zhangsan
girlAge: 18
- girlName: lisi
girlAge: 28
- girlName: wangwu
girlAge: 38
また、構成クラスを変更し、別のクラスを追加します。
// 添加类gril
public class Girl {
private String girlName;
private int girlAge;
public String getGirlName() {
return girlName;
}
public void setGirlName(String girlName) {
this.girlName = girlName;
}
public int getGirlAge() {
return girlAge;
}
public void setGirlAge(int girlAge) {
this.girlAge = girlAge;
}
@Override
public String toString() {
return "Girl{" +
"girlName='" + girlName + '\'' +
", girlAge=" + girlAge +
'}';
}
}
// 修改配置类如下
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
private String name;
private int age;
private List<String> mylist;
private String[] address;
private Set<Girl> girlFriends;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public List<String> getMylist() {
return mylist;
}
public void setMylist(List<String> mylist) {
this.mylist = mylist;
}
public String[] getAddress() {
return address;
}
public void setAddress(String[] address) {
this.address = address;
}
public Set<Girl> getGirlFriends() {
return girlFriends;
}
public void setGirlFriends(Set<Girl> girlFriends) {
this.girlFriends = girlFriends;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
", mylist=" + mylist +
", address=" + Arrays.toString(address) +
", girlFriends=" + girlFriends +
'}';
}
}
最終的なコンソール出力:
名前: チェンフェイリン
人物: 人物{name='feilin', age=24, mylist=[chenfeilin, 777, nagasawa_masami], address=[北京、天津、上海、重慶]、girlFriends=[Girl{girlName='zhangsan', girlAge=18}, Girl{girlName='lisi', girlAge=28}, Girl{girlName='wangwu', girlAge=38}]}
personName: feilin
複数の yml 設定ファイルがある場合は、設定クラスにマッピングするときに @PropertySource アノテーションを付けることでそれらを区別できます。
最初に設定ファイルを作成し、それに person のコンテンツをコピーしてから、
特定のアノテーションを person クラスに追加します。用途は以下の通りです。
@Component
@ConfigurationProperties(prefix = "person")
@PropertySource(value = {
"classpath:abc.yml"}, factory = YamlPropertySourceFactory.class)
public class Person {
...}
// 这里需要注解里需要指定一个yaml的加载工厂类,我们可以自己去定义一个:
// 使用的是YamlPropertySourceLoader类的load方法
public class YamlPropertySourceFactory extends DefaultPropertySourceFactory {
@Override
public PropertySource<?> createPropertySource(String name, EncodedResource resource) throws IOException {
if (resource == null) {
return super.createPropertySource(name, resource);
}
List<PropertySource<?>> sources = new YamlPropertySourceLoader().load(resource.getResource().getFilename(), resource.getResource());
return sources.get(0);
}
}
/**
导的包如下:
import org.springframework.boot.env.YamlPropertySourceLoader;
import org.springframework.core.env.PropertySource;
import org.springframework.core.io.support.DefaultPropertySourceFactory;
import org.springframework.core.io.support.EncodedResource;
*/
コンソール出力は変更されません。
person: person{name='feilin', age=24, mylist=[chenfeilin, 777, nagasawa_masami], address=[北京、天津、上海、重慶]、girlFriends=[Girl{girlName='zhangsan'、girlAge=18] }、女の子{girlName='lisi'、girlAge=28}、女の子{girlName='wangwu'、girlAge=38}]}
ここで注意すべき点の 1 つは、アノテーション @PropertySource は、ファクトリ属性を指定せずにエラーを報告することはありませんが、yml 設定ファイルに値をロードすることはできないということです。ここでは、それを使用する必要があります。デフォルトのローダーがインストールされていますが、デフォルトでは yml ファイルのロードをサポートしていないため、ファクトリ クラスをロードするにはこの yml ファイルを忘れずに追加してください。
5. SpringBoot設定情報の問い合わせ
SpringBoot の設定ファイルの主な目的は、デフォルトの設定情報を変更することですが、すべての設定キーの値を完全に覚えておくことは不可能です。使用する際はドキュメントを参照してください。ここでは springboot [ 2.0.1.RELEASE ] を
示します。バージョンの公式 Web サイトの設定ドキュメント:
ドキュメントの URL:
https://docs.spring.io/spring-boot/docs/2.0.1.RELEASE/reference/htmlsingle/#common-application-properties
6. YML ファイル構成情報のコードプロンプト
上記の公式 Web サイトで提供されている設定情報のクエリは、設定情報を一から理解するのに役立ちます。設定情報を使いこなして使いこなすようになると、必ず情報を確認せずに直接書き込むことになります。しかし、さまざまな不安があるため、この説明の理由は、私が間違ったボールを書いたためです。現時点では、記憶を取り戻すためにいくつかのプロンプト関数が必要です。
このコンテンツを紹介しているブログはたくさんありますが、コードを書く必要はなく、技術的な内容ではないので、車輪の再発明はしません。以前見たブログへのリンクです。 idea は SpringBoot yml ファイルをサポートしておらず、中国語のコメントが
文字化け
します。 :
Spring Boot application.yml ファイル 中国語のコメントが文字化けします
補足:
私が使用しているアイデアのバージョンは比較的新しいため、
使用されているプラグインは上記のブログのものと一致しない可能性があります。
追加するには:
yml ファイルを自分で作成する場合、または JBLSpringBootAppGen プラグインなどの他のプラグインを使用して yml ファイルを作成する場合、ファイルを作成するだけでは、yml にプロンプトが存在しないことがわかります。前のプロジェクトに既に存在する場合でも、ヒント: この時点ではまだプロンプトが表示されない可能性があります。yml ファイルを操作する前にプロジェクトを再構築する必要があります。そうすれば、プロンプトが有効になります。0.0
7.YML ファイルは互いにネストして使用されます
yml ファイルが長すぎる場合、または業務に応じて分割したい場合は、次の構成を使用して分割されたサブ構成ファイルを導入できます。
ネストされた単一:
spring:
profiles:
include:filename
複数のネスト:
spring:
profiles:
include:
- filename1
- filename2
サブ構成ファイルの名前は application-xxx.yml です。たとえば、単一の構成ファイルをネストする場合は application-filename.yml となります。
8. SpringBootは複数のYMLファイルに対応した複数の環境を構築します
リンクは次のとおりです。
1. Springboot マルチ環境構成ファイル、複数の yml 構成ファイルを含める方法は? この記事を読めば十分です
2. Springboot は複数の yml ファイルを設定します
3. SpringBoot の application.yml 切り替え関連の設定 (カスタム、開発、テスト、公式) について