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現在)なので、利用時は注意が必要です。