-S19: カスタムメイドカー

Seasar2コンポーネント生成方法の最後として、Selによるコンポーネント生成を見ていきます。

list19-1. 名前で取得するHighway.java修正版
package tutorial.org.seasar.console;
import org.seasar.framework.container.S2Container;
import org.seasar.framework.container.factory.S2ContainerFactory;
public class Highway {
  private static String PATH = "tutorial/org/seasar/console/car.xml";
  public static void main(String[] args) {
    S2Container container = S2ContainerFactory.create(PATH);
    Car car = (Car)container.getComponent("redCar");
    car.run();
  }
}

クライアント側は、コンポーネントを名前で取得します。これは、Selでコンポーネント生成する際の制限の一つです。

list19-2. list06-1の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);
  }
}

S06のType2設定を行うコンポーネントの再掲です。

list19-3. Selでコンポーネント生成するcar.xml修正版
<?xml version="1.0" encoding="UTF-8"?>
<components>
  <component name="redCar">
    new tutorial.org.seasar.console.PaintedCar()
    <property name="bodyColor">'red'</property>
  </component>
</components>

list19-3では、<component>エレメントに論点があります。<component>エレメントには、name属性の記述が有って、class属性の記述がありません。そして、<component>エレメントボディにSel式を記述しています。class属性の有る無しで通常のコンポーネント生成を行うか、Selでコンポーネント生成を行うかが分かれます。Selでコンポーネント生成する際の制限は以下のとおりです。

これらは、S2Containerがコンポーネント生成を完全に把握できないことに起因します。しかし、Type2およびType4によるコンポーネント設定は有効ですし、終了化メソッドもsingletonモードの場合有効です。
実行結果ではきちんとプロパティが設定されていることがわかります。

My body color is red

この、Selによるコンポーネント生成の利点は、コンストラクタ以外の方法によるコンポーネント生成が行えることです。例ではnew式を用いて直接インスタンス化を行っていますが、ファクトリーパターンによる生成や、JNDIを用いるような使い方ができます。JNDIでは以下の例を参考にしてください。

<component name="dataSource">initialContext.lookup('jdbc/orace')</component>