-S06: 車に色を塗る

コンポーネントをコンテナに登録して、後に取得することができました。次の段階として、コンポーネントの設定について説明していきます。Seasar2コンポーネントの設定がとても柔軟なことに特徴があります。コンポーネントの設定方法には、以下の3通りがあります。

  • プロパティを利用した設定(Type2)
  • コンストラクタの引数を利用した設定(Type3)
  • 初期化メソッドを利用した設定(Type4: Seasar2オリジナル用語)

まずは一番初めのプロパティを利用した設定を見ていきましょう。

list06-1. BodyColorプロパティを持つPaintedCar.java
package tutorial.org.seasar.console;
public class PaintedCar implements Car {
  private String color = "blue";
  public void setBodyColor(String color) {
    this.color = color;
  }
  public void run() {
    System.out.println("My body color is " + color);
  }
}

Carインターフェイスを実装したPaintedCarクラスは、BodyColorプロパティを持っています。list06-1ではセッターメソッドだけですから、書き込みのみのプロパティです。

list06-2. プロパティ設定を行うcar.xml修正版
<?xml version="1.0" encoding="UTF-8"?>
<components>
  <component class="tutorial.org.seasar.console.PaintedCar">
    <property name="bodyColor">'red'</property>
  </component>
</components>

設定XMLでは、<component>エレメントの子要素として<property>が新たに登場しました。この<property>エレメントはプロパティの設定のために用いるもので、その属性nameにプロパティ名、エレメントボディに設定値を記述します。list06-2の場合、"bodyColor"プロパティに"'red'"を設定しています。
実行結果は以下のとおりです。

My body color is red

<property>エレメントボディの設定を変えれば、実行結果も変わることを確認してみてください。
エレメントボディにはSeasar2の式言語であるSel(Seasar expression language)の記法を用います。ここではプロパティ型のStringを表記するため、シングルクォート(「'」)で文字列を囲っています。シングルクォートで囲わないと以下の例外が発生です。

org.seasar.framework.container.IllegalPropertyRuntimeException: [ESSR0059]クラス(tutorial.org.seasar.console.PaintedCar)のプロパティ(bodyColor)の設定に失敗しました。理由はorg.seasar.framework.container.ComponentNotFoundRuntimeException: [ESSR0046]コンポーネント(red)が見つかりません

Selがシングルクォートで囲っていない"red"を他のコンポーネントだと解釈しているためです。コンテナには"red"という名前のコンポーネントを登録してませんので、ComponentNotFoundRuntimeException例外が発生しています。