Seasarを使ってみる その2

コンストラクタ・インジェクション

コンストラクタ・インジェクションを試してみる。

コンポーネントの実装を以下のように修正。


[HogeImpl.java]
public class HogeImpl implements Hoge {

private String message = null;

public HogeImpl(String message) {
this.message = message;
}

public void showMessage() {
System.out.println(message);
}

}

diconファイルを以下のように修正。


[Hello.dicon]




"なんか文字列"


で、実行。


なんか文字列

動いた、動いた。

プリミティブ型とか、クラスがコンストラクタの引数になっている場合はどうするんだろう…と思って、以下のように修正。


[HogeImpl.java]
public class HogeImpl implements Hoge {

private intg message = -1;

public HogeImpl(int message) {
this.message = message;
}

[Hello.dicon]

12345

で、実行。


12345
これもちゃんと動いた。

他の場合はどうするんだろうと思っていたら、OGNL式についての説明があった。

  • 文字列は、"hoge"のように"で囲みます。
  • charは、'a'のように'で囲みます。
  • 数値は、123のようにそのまま記述します。
  • 論理値は、true,falseのようにそのまま記述します。
  • new java.util.Date(0)のようにクラスの完全限定名でコンストラクタを呼び出すことができます。
  • @java.lang.Math@max(1, 2)のようにstaticなメソッドを呼び出した結果を参照することができます。
  • @java.lang.String@classのようにクラスを参照できます。
  • hoge.toString()のようにコンポーネントのメソッドを呼び出した結果を参照することができます。この例は、どこかでhogeという名前のコンポーネントが定義されているという前提です。

…Mapの中にListがあってその中にMapがあって…みたいな複雑なデータ構造のオブジェクトを引数にするとめんどくさいかも。というか、そんなオブジェクトを渡しているのは設計に問題があるのかな?