[Seasar-user:457] Re: コンストラクタによるコンポーネント生成で問題
B isid.co.jp Yasuo Higa
higa
2004年 3月 10日 (水) 17:08:08 JST
<[E-MAIL ADDRESS DELETED]> の、
"[Seasar-user:454] Re: コンストラクタによるコンポーネント生成で問題" において、
"Masataka Kurihara <[E-MAIL ADDRESS DELETED]>"さんは書きました:
ひがです。
> 栗原です。
>
> 後者の場合は、確実にこのSeasar2の仕様で例外としてますが、コン
> ポーネント取得の方法を別に用意するという、シンプルベストの方針
> に反するかもしれませんが、ひとつの提案があります。
>
> // 提案メソッド
> 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();
> }
> }
> }
>
この場合は、
public class BatchExecutorImpl implements BatchExecutor {
List batches = new ArrayList();
public void addBatch(Batch batch) {
batches.add(batch);
}
public void execute() {
for (int i = 0; i < batches.size(); ++i) {
Batch batch = (Batch) batches.get(i);
batch.execute();
}
}
}
<component class="org.seasar.extention.BatchExecutorImpl">
<method name="addBatch">
<arg>
<component class=""org.seasar.extention.Batch1">
<arg>log</arg>
<aspect>s2Dao</aspect>
</component>
</arg>
</method>
<method name="addBatch">
...
</method>
</component>
public static void main(String[] args) {
S2Container container =
S2ContainerFactory.create("org/seasar/extention/seasar.xml");
BatchExecutor executor = container.getComponent(BatchExecutor.class);
executor.execute();
}
のほうが、いいんじゃないかなぁと思うのですが、どうでしょうか。
---
Yasuo Higa <[E-MAIL ADDRESS DELETED]>
INFORMATION SERVICES INTERNATIONAL-DENTSU,LTD.
Seasar-user メーリングリストの案内