読者です 読者をやめる 読者になる 読者になる

yohjizzz's Blog

I'm a Programmer.

自動登録サンプル。

たまには技術ネタ。(というほどでもないけど。)

S2Container を利用した場合のコンポーネントの自動登録(FileSystemComponentAutoRegister)や、
自動登録の対象コンポーネントに対するAOP(トレースやトランザクション定義)を適用する為の設定を書き留めておきます。

パッケージ、クラス名称による自動登録を行います。

  <component class="org.seasar.framework.container.autoregister.FileSystemComponentAutoRegister">
    <property name="instanceDef">@org.seasar.framework.container.deployer.InstanceDefFactory@REQUEST</property>
    <property name="autoNaming">
      <component class="org.seasar.framework.container.autoregister.DefaultAutoNaming" />
    </property>
    <initMethod name="addClassPattern">
      <arg>"jp.co.hoge.logic.impl"</arg> <!-- パッケージ・パターンを定義します。 -->
      <arg>".*ServiceImpl,.*FacadeImpl"</arg> <!-- クラス・パターンを定義します。 -->
    </initMethod>
  </component>

パッケージ、クラス名称によるAOP(トレース)の適用を行います。

  <component class="org.seasar.framework.container.autoregister.AspectAutoRegister">
    <property name="interceptor">aop.traceInterceptor</property> <!-- メソッドをトレースするインターセプタを定義します。 -->
    <initMethod name="addClassPattern">
      <arg>"jp.co.hoge.logic.impl"</arg> <!-- パッケージ・パターンを定義します。 -->
      <arg>".*ServiceImpl,.*FacadeImpl"</arg> <!-- クラス・パターンを定義します。 -->
    </initMethod>
  </component>

パッケージ、クラス、メソッド名称によるAOPトランザクション)の適用を行います。

  <component class="org.seasar.framework.container.autoregister.AspectAutoRegister">
    <property name="interceptor">j2ee.requiredTx</property> <!-- トランザクション属性を定義します。 -->
    <property name="pointcut">create.*,modify.*,save.*,remove.*"</property> <!-- メソッド・パターンを定義します。 -->
    <initMethod name="addClassPattern">
      <arg>"jp.co.hoge.logic.impl"</arg> <!-- パッケージ・パターンを定義します。 -->
      <arg>".*ServiceImpl,.*FacadeImpl"</arg> <!-- クラス・パターンを定義します。 -->
    </initMethod>
  </component>

通常、上記のようなアプリで実装するコンポーネントなど、
アプリに特化する内容は app.dicon もしくは app.dicon によりインクルードされるアプリ専用の dicon に定義するのが望ましい。(と思います。)
また app.dicon は aop.dicon や j2ee.dicon など S2 が提供する標準の dicon を必要に応じてインクルードする必要があります。
 上記で行っているトレースのインターセプタである aop.traceInterceptor は aop.dicon に定義されています。
 上記で行っているトランザクションのインターセプタである j2ee.requiredTx は j2ee.dicon に定義されています。

S2Dao を利用するのであれば、さらに dao.dicon のインクルードが、
S2Struts を利用するのであれば、さらに s2struts.dicon のインクルードが必要です。

InterceptorChain による複数のインターセプタの一括適用も可能です。

  <!-- インターセプタをグルーピングします。 -->
  <component name="appInterceptorChain" class="org.seasar.framework.aop.interceptors.InterceptorChain">
    <initMethod name="add">interceptor1</initMethod> <!-- 定義済みのインターセプタ(1)です。 -->
    <initMethod name="add">interceptor2</initMethod> <!-- 定義済みのインターセプタ(2)です。 -->
    <initMethod name="add">interceptor3</initMethod> <!-- 定義済みのインターセプタ(3)です。 -->
  </component>

  <component class="org.seasar.framework.container.autoregister.AspectAutoRegister">
    <property name="interceptor">appInterceptorChain</property>
    <initMethod name="addClassPattern">
      <arg>"jp.co.hoge.logic.impl"</arg> <!-- パッケージ・パターンを定義します。 -->
      <arg>".*ServiceImpl,.*FacadeImpl"</arg> <!-- クラス・パターンを定義します。 -->
    </initMethod>
  </component>

#dicon については "S2Container", S2標準dicon が役に立つと思います。