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