Seasar DI Container with AOP

SMART deployの設定方法

SMART deployを利用すると、コンポーネント定義の設定を自動化できます。 このページではSMART deployの設定に必要な情報といくつかの設定例を紹介します。

目次

Creator(クリエータ)とCustomizer(カスタマイザ)

SMART deployにおけるコンポーネントの自動登録にはS2Container内のCreator(クリエータ)やCustomizer(カスタマイザ)と呼ばれるコンポーネント群が使用されています。 以下では、SMART deployの理解に必須であるクリエータとカスタマイザについてそれぞれ説明します。

クリエータとはSMART deployの命名規約に従いコンポーネント定義を作成するコンポーネントの総称です。 クリエータは規約に従いインスタンス属性やコンポーネント名などコンポーネントに必要な情報を決定しコンポーネント定義を作成します。 コンポーネント定義を作成した後は、自身に関連付けられたカスタマイザを呼び出します。

カスタマイザとはコンポーネント定義をカスタマイズするコンポーネントの総称です。 クリエータに呼び出されたカスタマイザは自身に定義されたカスタマイズ処理をコンポーネント定義に対し実行します。 カスタマイザの機能の代表例はアスペクト定義(インターセプタ)の追加です。 例えば、サービスのカスタマイザにトレース出力のアスペクト定義を設定すると、サービスのクリエータによって作成されたすべてのコンポーネントにトレース出力のインターセプタが自動で適用されます。

クリエータ

Seasar2にはあらかじめ以下に示すクリエータが用意されています。 これらのクリエータは、それぞれ規約に合致するクラスのコンポーネント定義を作成します。 クリエータはcreator.diconに定義する必要があります。

クリエータ一覧

クリエータのクラスの単純名 コンポーネント化対象とするクラスの名前のサフィックス 関連付けられたカスタマイザのコンポーネント名 作成するコンポーネントのインスタンス属性
ActionCreatorActionactionCustomizerrequest
ConverterCreatorConverterconverterCustomizerprototype
DaoCreatorDaodaoCustomizerprototype
DtoCreatorDtodtoCustomizerrequest
DxoCreatorDxldxoCustomizersingleton
HelperCreatorHelperhelperCustomizerprototype
InterceptorCreatorInterceptorinterceptorCustomizerprototype
LogicCreatorLogicinterceptorCustomizerprototype
PageCreatorPagepageCustomizerrequest
ServiceCreatorServiceserviceCustomizerprototype
ValidatorCreatorValidatorvalidatorCustomizerprototype

クリエータが作成するコンポーネント定義に設定されるインスタンス属性は、あらかじめクリエータごとにデフォルトの値が指定されています。

クリエータは、クラス名のサフィックスを利用して対象となるクラスを見つけコンポーネント定義を作成します。 作成したコンポーネント定義は関連付けられたカスタマイザに渡されます。 クラスを個別パッケージから探す場合とサブアプリケーションパッケージから探す場合で検出の条件は異なります。

クラスの検出条件

  パッケージ名に関する条件 クラス名に関する条件
個別パッケージから見つける場合クラスのパッケージ名が「ルートパッケージ名.サフィックスを小文字にした文字列」で始まっているクラス名がサフィックス、もしくはサフィックスとImplを連結した文字列で終わっている
サブアプリケーションから見つける場合クラスのパッケージ名が「ルートパッケージ名.web」で始まっているクラス名がサフィックス、もしくはサフィックスとImplを連結した文字列で終わっている

ルートパッケージ、個別パッケージ、サブアプリケーションの説明についてはSMART deployを参照してください。

カスタマイザ

S2Containerにはdefault-customizer.diconに定義されたデフォルトカスタマイザとstd-customizer.diconに定義された標準カスタマイザがあらかじめ用意されています。 アプリケーションで定義するカスタマイザはcustomizer.diconに記述してください。

デフォルトカスタマイザ

デフォルトカスタマイザはクリエータに関連付けられるカスタマイザです。 クリエータがコンポーネント定義を作成したあとにこれらのカスタマイザが呼び出されます。 デフォルトカスタマイザには以下のコンポーネントがあります。

デフォルトカスタマイザ一覧
コンポーネント名説明
actionCustomizerAction用のカスタマイザ
converterCustomizerConverter用のカスタマイザ
daoCustomizerDao用のカスタマイザ
dtoCustomizerDto用のカスタマイザ
dxoCustomizerDxoカスタマイザ
helperCustomizerHelper用のカスタマイザ
logicCustomizerLogic用のカスタマイザ
interceptorCustomizerInterceptor用のカスタマイザ
pageCustomizerPage用のカスタマイザ
serviceCustomizerService用のカスタマイザ
validatorCustomizerValidator用のカスタマイザ

これらのコンポーネントのクラスはorg.seasar.framework.container.customizer.CustomizerChainです。

CustomizerChainには任意の数のカスタマイザを設定(チェイン)可能ですが、デフォルトカスタマイザのコンポーネントには何も設定されていません。 したがって、デフォルトカスタマイザはクリエータから呼び出されても何の処理も実行しません。 デフォルトカスタマイザがそのように定義されている理由は、カスタマイザをどのように設定するかはアプリケーション開発者に委ねられているからです。

カスタマイザの設定はデフォルトカスタマイザの設定を上書きする形でcustomizer.diconに記述します。 その設定は通常CustomizerChainに任意の標準カスタマイザを追加することで行います。

標準カスタマイザ

標準カスタマイザはアプリケーションで定義するカスタマイザの設定に標準的に利用されることを想定したコンポーネントです。 標準カスタマイザには以下のコンポーネントがあります。

標準カスタマイザ一覧
コンポーネント名関連付けられたインターセプト名説明
traceCustomizeraop.traceInterceptorトレース出力のためのカスタマイザ
simpleTraceCustomizeraop.simpleTraceInterceptor引数や戻り値を出力しない単純なトレースのためのカスタマイザ
classLoaderAwareTraceCustomizeraop.classLoaderAwareTraceInterceptorクラスローダーの情報を含めたトレース出力のためのカスタマイザ
syncCustomizeraop.syncInterceptor同期処理のためのカスタマイザ
traceThrowsCustomizeraop.traceThrowsInterceptor例外のトレース出力のためのカスタマイザ
toStringCustomizeraop.toStringInterceptorオブジェクトのフィールドの値を文字列化するためのカスタマイザ
removeSessionCustomizeraop.removeSessionInterceptorメソッドの実行後にHTTPセッションから属性を削除するためのカスタマイザ
commandTraceCustomizeraop.traceInterceptordo.*, initialize, prerenderをポイントカットとしてトレース出力するカスタマイザ
requiredTxCustomizerj2ee.requiredTxRequiredのトランザクション属性を有効にするためのカスタマイザ
requiresNewTxCustomizerj2ee.requiresNewTxRequiresNewのトランザクション属性を有効にするためのカスタマイザ
mandatoryTxCustomizerj2ee.mandatoryTxMandatoryのトランザクション属性を有効にするためのカスタマイザ
notSupportedTxCustomizerj2ee.notSupportedTxNotSupportedのトランザクション属性を有効にするためのカスタマイザ
neverTxCustomizerj2ee.neverTxNeverのトランザクション属性を有効にするためのカスタマイザ
s2DxoCustomizerdxo.interceptorDxoを利用するためのカスタマイザ
s2DaoCustomizerdao.interceptorS2Daoを利用するためのカスタマイザ
kuinaDaoCustomizerkuinaDao.interceptorKuina-Daoを利用するためのカスタマイザ

これらのコンポーネントのクラスはorg.seasar.framework.container.customizer.AspectCustomizerです。 AspectCustomizerはコンポーネント定義にアスペクト定義を登録するカスタマイザです。

標準カスタマイザはインターセプタと関連づけられています。 実行時、標準カスタマイザは関連付けられたインターセプタからアスペクト定義を作成しコンポーネント定義に登録します。 標準カスタマイザはアプリケーション開発者がcusomizer.diconに定義するCustomizerChainに設定して利用すべきものです。

カスタマイザの設定

アプリケーションで使用するカスタマイザの設定はcustomizer.diconに定義します。 例えば、サービスのコンポーネントに標準のカスタマイザであるtraceCustomizertraceThrowsCustomizerを適用する場合、次のように記述します。

<components>
  <include path="default-customizer.dicon"/>
  ...
  <component name="serviceCustomizer" 
    class="org.seasar.framework.container.customizer.CustomizerChain">
    <initMethod name="addCustomizer">
      <arg>traceCustomizer</arg>
    </initMethod>
    <initMethod name="addCustomizer">
      <arg>traceThrowsCustomizer</arg>
    </initMethod>
  </component>
  ...
</components>

定義するコンポーネントの名前はデフォルトカスタマイザ一覧に示したコンポーネント名と同じにしてください。 こうすることでcusomizer.diconの定義がdefault-customizar.diconの定義より優先されます。 したがって、クリエータはcusomizer.diconに定義されたカスタマイザを使用することになります。

クラスにはCustomizerChainを指定してください。このクラスには任意の個数のカスタマイザを登録できます。

設定例

カスタマイザの設定例を紹介します。 ここで紹介する設定はすべてcusomizer.diconに記述されることを想定しています。

特定のパターンに従ってカスタマイザを適用する

  • パターンに合致するコンポーネントにのみカスタマイザを適用する場合

  • 例えば、サービスのコンポーネントのうち「Hoge」で始まるクラス名をもつコンポーネントにtraceCustomizerを適用する場合、 次のようにaddClassPatternメソッドを使用し条件を引数で渡します。 第1引数にはパッケージ名、第2引数にはクラス名の正規表現を指定します。 第1引数のパッケージ名は、前方一致条件として使用されます。 たとえば、「example.hoge」を指定した場合「example.hoge」も「example.hoge.foo」もパターンに合致するとみなされます。

      <component name="serviceCustomizer" 
        class="org.seasar.framework.container.customizer.CustomizerChain">
        <initMethod name="addClassPattern">
          <arg>"example.service"</arg>
          <arg>"Hoge.*"</arg>
        </initMethod>
        <initMethod name="addCustomizer">
          <arg>traceCustomizer</arg>
        </initMethod>    
      </component>
    
  • パターンに合致するコンポーネントにはカスタマイザを適用しない場合

  • 逆に、サービスのコンポーネントのうち「Hoge」で始まるクラス名をもつコンポーネントにはtraceCustomizerを適用しない場合、 次のようにaddIgnoreClassPatternメソッドを使用し条件を引数で渡します。 第1引数にはパッケージ名、第2引数にはクラス名の正規表現を指定します。 第1引数のパッケージ名は、前方一致条件として使用されます。

      <component name="serviceCustomizer" 
        class="org.seasar.framework.container.customizer.CustomizerChain">
        <initMethod name="addIgnoreClassPattern">
          <arg>"example.service"</arg>
          <arg>"Hoge.*"</arg>
        </initMethod>
        <initMethod name="addCustomizer">
          <arg>traceCustomizer</arg>
        </initMethod>    
      </component>
    

トランザクション制御を設定する

  • サービスのコンポーネントに適用する場合

  • serviceCustomizerにトランザクション制御を有効にするためのカスタマイザを設定します。 ここではRequiredのトランザクション属性に対応するrequiredTxCustomizerを使用します。 他のトランザクション属性に対応するカスタマイザについては標準カスタマイザ一覧を参照してください。

      <component name="serviceCustomizer" 
        class="org.seasar.framework.container.customizer.CustomizerChain">
        <initMethod name="addCustomizer">
          <arg>requiredTxCustomizer</arg>
        </initMethod>
      </component>
    

    この設定ではサービスのコンポーネントが実装するインタフェースのすべてのメソッドがトランザクション制御の対象になります。

  • ページのコンポーネントに適用する場合

  • pageCustomizerにトランザクション制御を有効にするためのカスタマイザを設定します。 ページのコンポーネントでトランザクション制御を行う場合は制御の対象となる特定のメソッドをポイントカットとして指定します。

    ポイントカットを指定する場合は標準カスタマイザを使用できないので、 次のようにAspectCustomizerのコンポーネントをpageCustomizerに設定する必要があります。 インターセプタ名とポイントカットをAspectCustomizerのプロパティに設定します。 インターセプタ名には標準カスタマイザ一覧に示したインターセプタ名が使用できます。

      <component name="pageCustomizer" 
        class="org.seasar.framework.container.customizer.CustomizerChain">
        <initMethod name="addCustomizer">
          <arg>
            <component class="org.seasar.framework.container.customizer.AspectCustomizer">
              <property name="interceptorName">"j2ee.requiredTx"</property>
              <property name="pointcut">"do.*, initialize, prerender"</property>
            </component>
          </arg>
        </initMethod>
      </component>
    
  • EJB 3.0のステートレスセッションBeanを利用する場合

  • EJB 3.0のステートレスセッションBeanはデフォルトでトランザクション制御を行う機能が備わっているのでcusomizer.diconに対する設定は不要です。 S2ContainerのEJB 3.0サポートについてはEJB3.0 Simplified APIを参照してください。

インスタンス属性がsingleton以外のインターセプタを利用する

インターセプタを適用するAspectCustomizeruseLookupAdapterプロパティにtrueを設定をします。

  <component name="pageCustomizer" 
    class="org.seasar.framework.container.customizer.CustomizerChain">
    <initMethod name="addCustomizer">
      <arg>
        <component class="org.seasar.framework.container.customizer.AspectCustomizer">
          <property name="useLookupAdapter">true</property>
          <property name="interceptorName">"app_aop.authenticateInterceptor"</property>
          <property name="pointcut">"do.*"</property>
        </component>
      </arg>
    </initMethod>
  </component>

※ この例で使用した「app_aop.authenticateInterceptor」という名前のインターセプタは標準で用意されているものではありません。

複数のデータソースを利用する

データソースごとにカスタマイザを作成し、それらのカスタマイザをdaoCustomizerに設定してください。 S2Daoを使用した例についてはSMART deployで複数データソースに対応するには?を参照してください。