SMART deploy対象のコンポーネントをDIするには?

S2.4系では、SMART deployを使うことで、大抵のコンポーネントを自動登録できます。
しかしながら、コンストラクタ・インジェクションセッター・インジェクションメソッド・インジェクションをしたいときなど、個別にコンポーネント定義したいケースもあります。

例えばこんな感じで指定したい場合(セッター・インジェクション)。

<components>
    <component name="..." class="...">
        <property name="...">...</property>
    </component>
</components>

上記のような定義に加え、SMART deploy対象のコンポーネント自動バインディング(DI)したいときはどうするか、ですが、この場合、インジェクションを行う対象のコンポーネントをapp.dicon に定義することになります。

  • paramというプロパティは、セッター・インジェクションで指定したい。
  • registerというプロパティは、自動バインディングして欲しい。

というようなクラスがあった場合、以下のように指定することになります。

public class SMARTDeploySample {

  private int               param;
  private RegisterComponent registerComponent;

  public setParam(int param) {
    // ・・・・
  }

  public setRegisterComponent(RegisterComponent registerComponent) {
    // SMART deploy 対象のコンポーネント
  }

}
  • app.dicon
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN"
    "http://www.seasar.org/dtd/components24.dtd">
<components>
    <include path="aop.dicon"/>

    <component class="example.seasar2.smartdeploy.SMARTDeploySample ">
        <property name="param">1</property>
    </component>
</components>


上記の場合は、1つのコンポーネントしか定義していませんが、実際のプロジェクトではもっと多くのコンポーネントを定義する必要があるでしょう。その場合は、XIncludeの機能を利用し、うまくdiconを分割すると良いでしょう。
ただし、J2SE1.4.xでXIncludeを利用するには,Xerces(2.7.0 以降)と組み合わせて使用する必要があります。


Teeda Extensionでは、examplesに同梱されているXercesのバージョンが、2.6.2(12/13現在)なので、利用時は注意が必要です。