[Seasar-user:454] Re: コンストラクタによるコンポーネント生成で問題
B gluegent.com Masataka Kurihara
kurihara
2004年 3月 10日 (水) 14:11:22 JST
栗原です。
TooManyRegistrationRuntimeException が出る場合、つまりは同じ
インターフェイスの実装クラスを登録したときに、getComponentで
取得するコンポーネントをひとつに絞れず例外が出るのだけども、
少なからず狙いがある場合は以下があるかと整理しました。
1)違うインターフェイスを実装してるけど、インターフェイスの
継承関係から、同じインターフェイスをキーとしていると解釈され
る場合。
2)まったく同じインターフェイスを実装したコンポーネントを複数
登録したい場合。
前者はこの前のメールの内容ですが、後者についても考えてみました。
後者の場合は、確実にこのSeasar2の仕様で例外としてますが、コン
ポーネント取得の方法を別に用意するという、シンプルベストの方針
に反するかもしれませんが、ひとつの提案があります。
public interface S2Container {
// 既存メソッド
public Object getComponent(Class componentClass)
throws
ComponentNotFoundRuntimeException,
TooManyRegistrationRuntimeException,
CyclicReferenceRuntimeException;
// 提案メソッド
public Object[] getComponentArray(Class componentClass)
throws
ComponentNotFoundRuntimeException,
CyclicReferenceRuntimeException;
// 他の既存メソッドは省略
}
インターフェイスでルックアップすると、それらは同じメソッドを持ってる
のだから、取得した配列をループでメソッドコールすればいいかなと。たと
えば以下に例示しました。コンポーネントそれぞれはシングルトンですが、
インターフェイスレベルではマルチです。
#インターフェイス
public interface BatchAction {
public String execute();
}
#設定ファイル
<components>
<include path="org/seasar/extention/util.xml"/>
<component class=""org.seasar.extention.Batch1">
<arg>log</arg>
<aspect>s2Dao</aspect>
</component>
<component class=""org.seasar.extention.Batch2"/>
<arg>log</arg>
</component>
<component class=""org.seasar.extention.Batch3"/>
<arg>log</arg>
</component>
<component class=""org.seasar.extention.Batch4"/>
<arg>log</arg>
</component>
<component class=""org.seasar.extention.Batch5">
<arg>log</arg>
<aspect>mail</aspect>
</component>
</components>
#コンテナ生成-クライアント
public Bootstrap {
public static void main(String[] args) {
S2Container container =
S2ContainerFactory.create("org/seasar/extention/seasar.xml");
Object[] actions = container.getComponentArray(BatchAction.class);
for(int i = 0; i < actions.length; i++) {
((BatchAction)actions[i]).execute();
}
}
}
--
株式会社グルージェント
栗原 傑享(くりはら まさたか)
渋谷区渋谷3-7-6 第6矢木ビル4F
TEL:03-5469-8869 FAX:03-5469-8879
URL:http://www.gluegent.com/
--
Seasar-user メーリングリストの案内