JYaml でお手軽 DI


本来、YAML パーサーとして用いられる JYaml を使ってお手軽 DI (依存性の注入)を試してみます。


依存性の注入先

まずは、依存性の注入先を作成

Process.java

/**
 * 依存性注入用の I/F.
 */
public interface Process {
    public void process();
}

Configuration.java
/**
 * Yaml を読み込むクラス.
 */
public class Configuration {
    public Process p1;
    public Process p2;
    public Process p3;
}

実行コード

続いて、これを実行するメソッドを次のように定義

main.java

/**
 * テストメソッド.
 */
public static void main(String[] args) throws Throwable {

    Configuration configuration = Yaml.loadType(new File("configuration.yml"), Configuration.class);

    configuration.p1.process();
    configuration.p2.process();
    configuration.p3.process();
}

Yaml.loadType で YAML ファイルをロードしていますが、この際に依存性が注入されます

実装クラスの用意

そして Process I/F を実装したクラスを用意

StrPrinter.java

/**
 * 文字列を出力するクラス.
 */
public static class StrPrinter implements Process {
    public String str;

    @Override
    public void process() {
        System.out.println(str);
    }
}

NumberPrinter.java
/**
 * 数値を出力するクラス.
 */
public static class NumberPrinter implements Process {
    public Integer number;

    @Override
    public void process() {
        System.out.println(number);
    }
}

YAML の用意

依存性を定義した YAML ファイルを用意

configuration.yml

p1: !StrPrinter
    str: 八 足す
p2: !StrPrinter
    str: Ⅱ は
p3: !NumberPrinter
    number: 10

実行

先ほどのテストメソッドを実行すると以下のように結果が出力される。

実行結果

八 足す
Ⅱ は
10


あとがき

Process I/F の実装方法次第でもっと色々できます。
また、JYaml を使っているので、フィールド値の追加も簡単にだったり、
今回は引数なし、戻り値なしで簡単に作りましたが、
ジェネリクスなどで各々用意すると、さらに幅が広がります。

奥が深いですね