[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 メーリングリストの案内