Javaの世界では、物事は構成プロパティに引き渡され、このモジュールへのアップまたは古いJDK1.0から遡及はで始まりました。
「私の神は、これは20年前のものですが、私は実際にはまだプロパティを使用します..」
しかし、この記事の主人公は、プロパティではなく、YAML。これは、比較でYAMLのビーチの観客のビットマイクロアーキテクチャの最愛の人にサービスの新しい時代で、[プロパティ。
ほとんどのプロジェクトは、過去に、我々は設定に使用されるサービス属性、機械・マシン・インターフェースの対話、国際などの使用が含まれるトレースのプロパティプロファイルを、見つけることができます。
そして、いくつかの例少量、のようないくつかの「ハイブリッド」アプローチ、があります。
- XMLは、いくつかのテンプレートを表現するために使用します
- JSONフォーマットされた文字列
- テキスト形式、アプリケーションの自己分析をストリーキング
...
混在構成は、多くの場合、コードが古いので、彼が亡くなったと他の理由死亡し、内部の「悪趣味」項目の一部に充填され、統一された方法を形成することは困難です。
ただし、プロパティのプロパティは、このような簡単な構成でファイルを開くに加えて、他の方法の使用は、多様な要求を満たすために、複雑な構成に過ぎません。
だから、このシナリオでYAMLの契約が生成され、公式文書SpringBootで、多くのスペースが構文YAML設定フォーマットを使用することです。
ここではいくつかのYAMLであり、それがどのように使用されています。
まず、YAMLは何ですか
ウィキペディアからの定義:
。「YAMLは 、クラーク・エヴァンスによるデータのシリアライズ形式を使用して簡単には最初2001年に可読性の高い出版されたされ、」
目に見えるYAMLは非常に新しいものではありませんが、多くの人々が接触していましたより多くの何もありません。また、YAMLはまた、プログラミング言語やフレームワークのさまざまな汎用性の高いサポート。
Javaシステムでは、一般的なマイクロ優先サービス・フレームワークもYAMLが好ましい構成言語として推奨サポート。
YAML自体は何の特性を持っていますか?次の例を見て:
environments:
dev:
url: https://dev.example.com
name: Developer Setup
prod:
url: https://another.example.com
name: My Cool App
この構文は同等の特性です。
environments.dev.url=https://dev.example.com
environments.dev.name=Developer Setup
environments.prod.url=https://another.example.com
environments.prod.name=My Cool App
目に見える、YAML、比較的より構造化された対象における発現のために、より適しています。
これは、構文で、このような機能を備えています。
- 大文字と小文字を区別する
- 異なるプラットフォームに表示するテキストを整列するために主に考慮の必要性を取ったときに、Tabキーを使用して放棄し、階層関係を表すインデントには空白を使って下さい
- スペースの数は左の要素が同じレベルに整列されている限り、問題ではありませんインデントします
- コメント行は、#で始まるとして使用します
- ( - )ハイフンを使用して配列要素の開始時には記載されています
プロパティコントラスト
特性は十分に国際コンテンツの数が設定されているなど、キーと値の設定を実装することができます。
プロパティが、ケースが良く、このショートボードを補うYAML可能性がある場合、マルチレベルのネスト関係を示すことは難しいです。
これに対し、JSON
、YAMLやJSON自体が構造化された表現言語ですどちらも、はるかに良いか悪いかではなく、JSONのデザインは、使いやすさに焦点を当てて、利便性がトランスミッションを備えて
(とYAMLは可読性に焦点を当てて外観の詳細ケア)は、ほぼYAML、JSONは構造化フォーマット)より読みやすく(そしてより美しくある「スーパーセット」、と見られて取ることができます。
さらに、生成及び種々のクロス言語、分散環境とインタラクティブ伝送のために容易にJSONを解析し、同時に、それだけ、よりYAML構成を用いる一般的です。
YAMLの定義の場所は以下へのアクセスを提供します。
http://www.yaml.org/spec/1.2/spec.html
二、YAML構文
YAMLは、それが唯一の三つの要素を定義して、非常に簡単です:
- オブジェクト:JavaのHashMapのに対応するキーと値のペアのコレクション
- アレイ:シーケンス内の値のセット、Javaのリストに対応
- 単一値:個々の値を分割することができない、といった3、「ジャクソン」
オブジェクトが表すどの
オブジェクト属性を次のように、入れ子関係は、インデントスペースを整列させることにより発現します:
article:
title: 一个人的自白书
author:
name: 陈玲
gender: female
どのアレイ表すために
コネクタを介して配列の要素を-次のように表現():
article:
title: 一个人的自白书
tags:
- 传记
- 社会
- 人物
ベースユニットを構成するオブジェクト、配列の内容は、単一の値であり、支持体のタイプの単一の値は、7つのYAMLは次があります。
タイプ | 例 |
---|---|
弦 | ボブ |
ブール値 | 真 |
整数 | 199 |
フロート | 19.91 |
ヌル | 〜 |
時間 | 2001-12-14T22:14:09.10 + 08:00 |
日付 | 2019年1月9日 |
ここで、日付、時間がかかるかもしれない、その定義を参照の上、国際標準ISO 8601形式を使用して:
https://www.w3.org/TR/NOTE-datetime
通常の状況下では単一の値は、行に終了します。ただし、複数行の文字列が発生した場合、あなたはいくつかの特殊文字を使用することができ、表現されている
ような。
text: |
Hello
World
に対応する結果:
{ text: 'Hello\nWorld\n' }
あなたが使用することができます+は、文字列の改行の終わりについて留保を表明-文字列の改行の終わりを削除することを意味します。
text1: |+
Hello
text2: |-
Hello
に対応する結果:
{ text1: 'Hello\n\n\n', text2: 'Hello' }
また、YAMLも参照、関数、正規表現やその他の高度な使用方法をサポートしていますが、めったにプロジェクトで使用されていません。
第三に、操作YAML
現在、YAMLを動作させるために使用する共通のコンポーネントライブラリが標準サポートし、スネークYAMLでYAML 1.1バージョンを。
SpringBoot 官方文档也介绍了整合该框架的方式,参考下面的地址:
https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-external-config-loading-yaml
下面提供 将SnakeYaml 整合到项目的样例。
A. 引入框架
在Maven的pom.xml文件中添加:
<dependency>
<groupId>org.yaml</groupId>
<artifactId>snakeyaml</artifactId>
<version>1.21</version>
</dependency>
B. 代码片段
实现加载配置文件
如下面的代码,实现了从类路径config.yml文件中加载 yaml 配置内容:
InputStream inputStream = YamlUtil.class.getClassLoader()
.getResourceAsStream("config.yml");
Yaml yaml = new Yaml();
Map<String, Object> objectMap = yaml.load(inputStream);
System.out.println(objectMap.get("path"));
实现对象转换
定义如下的Pojo 对象:
public static class A{
private String name = "hello";
private List<B> bs = new ArrayList<B>();
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<B> getBs() {
return bs;
}
public void setBs(List<B> bs) {
this.bs = bs;
}
}
public static class B{
private String id = UUID.randomUUID().toString();
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
}
通过 SnakeYaml 将对象输出为 Yaml 格式的代码:
A a = new A();
a.getBs().add(new B());
a.getBs().add(new B());
Yaml yaml = new Yaml();
String aString = yaml.dumpAsMap(a);
System.out.println(aString);
输出结果如下:
bs:
- id: b3688f05-ea7e-436b-bc9a-9c5df555c7fd
- id: 7906224d-8ecc-43b8-bc3b-07985bc18ebd
name: hello
此时如果希望将Yaml 文本反过来转换为 A 对象,可以执行下面的代码:
A a1 = new Yaml().parseToObject(aString, A.class);
...
C. 完整案例
最终,我们可以将 Yaml 文档的操作封装为一个工具类,方便在业务代码中集成。
YamlUtil.java
public class YamlUtil {
/**
* 从资源文件加载内容,并解析为Map对象
*
* @param path
* @return
*/
public static Map<String, Object> loadToMap(String path) {
if (StringUtils.isEmpty(path)) {
return Collections.emptyMap();
}
InputStream inputStream = YamlUtil.class.getClassLoader()
.getResourceAsStream(path);
Yaml yaml = new Yaml();
Map<String, Object> objectMap = yaml.load(inputStream);
return objectMap;
}
/**
* 将字符串解析为Map对象
*
* @param content
* @return
*/
public static Map<String, Object> parseToMap(String content) {
if (StringUtils.isEmpty(content)) {
return Collections.emptyMap();
}
Yaml yaml = new Yaml();
Map<String, Object> objectMap = yaml.load(content);
return objectMap;
}
/**
* 将字符串解析为类对象
*
* @param content
* @param clazz
* @param <T>
* @return
*/
public static <T> T parseToObject(String content, Class<T> clazz) {
if (StringUtils.isEmpty(content) || clazz == null) {
return null;
}
Yaml yaml = new Yaml(new Constructor(clazz));
T object = yaml.load(content);
return object;
}
/**
* 格式化对象
*
* @param object
* @return
*/
public static String format(Object object) {
Yaml yaml = new Yaml();
return yaml.dumpAsMap(object);
}
}
至此,我们已经完成了 Yaml 的读写。当然,除了上述的Snake Yaml 之外,还可以使用 流行的 Jackson 组件了进行解析,这里不再过多赘述,有兴趣的朋友可以自行尝试。
参考文档
阮一峰-YAML语言教程:
http://www.ruanyifeng.com/blog/2016/07/yaml.html
SnakeYaml 官方文档:
https://bitbucket.org/asomov/snakeyaml/wiki/Documentation
Yaml 1.2 规范:
http://www.yaml.org/spec/1.2/spec.html
SpringBoot-LoadingYaml
https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-external-config-loading-yaml