SMART deployの設定方法
SMART deployを利用すると、コンポーネント定義の設定を自動化できます。
このページではSMART deployの設定に必要な情報といくつかの設定例を紹介します。
目次
Creator(クリエータ)とCustomizer(カスタマイザ)
SMART deployにおけるコンポーネントの自動登録にはS2Container内のCreator(クリエータ)やCustomizer(カスタマイザ)と呼ばれるコンポーネント群が使用されています。
以下では、SMART deployの理解に必須であるクリエータとカスタマイザについてそれぞれ説明します。
クリエータとはSMART deployの命名規約に従いコンポーネント定義を作成するコンポーネントの総称です。
クリエータは規約に従いインスタンス属性やコンポーネント名などコンポーネントに必要な情報を決定しコンポーネント定義を作成します。
コンポーネント定義を作成した後は、自身に関連付けられたカスタマイザを呼び出します。
カスタマイザとはコンポーネント定義をカスタマイズするコンポーネントの総称です。
クリエータに呼び出されたカスタマイザは自身に定義されたカスタマイズ処理をコンポーネント定義に対し実行します。
カスタマイザの機能の代表例はアスペクト定義(インターセプタ)の追加です。
例えば、サービスのカスタマイザにトレース出力のアスペクト定義を設定すると、サービスのクリエータによって作成されたすべてのコンポーネントにトレース出力のインターセプタが自動で適用されます。
Seasar2にはあらかじめ以下に示すクリエータが用意されています。
これらのクリエータは、それぞれ規約に合致するクラスのコンポーネント定義を作成します。
クリエータはcreator.diconに定義する必要があります。
クリエータ一覧
クリエータのクラスの単純名 |
コンポーネント化対象とするクラスの名前のサフィックス |
関連付けられたカスタマイザのコンポーネント名 |
作成するコンポーネントのインスタンス属性 |
ActionCreator | Action | actionCustomizer | request |
ConverterCreator | Converter | converterCustomizer | prototype |
DaoCreator | Dao | daoCustomizer | prototype |
DtoCreator | Dto | dtoCustomizer | request |
DxoCreator | Dxl | dxoCustomizer | singleton |
HelperCreator | Helper | helperCustomizer | prototype |
InterceptorCreator | Interceptor | interceptorCustomizer | prototype |
LogicCreator | Logic | interceptorCustomizer | prototype |
PageCreator | Page | pageCustomizer | request |
ServiceCreator | Service | serviceCustomizer | prototype |
ValidatorCreator | Validator | validatorCustomizer | prototype |
クリエータが作成するコンポーネント定義に設定されるインスタンス属性は、あらかじめクリエータごとにデフォルトの値が指定されています。
クリエータは、クラス名のサフィックスを利用して対象となるクラスを見つけコンポーネント定義を作成します。
作成したコンポーネント定義は関連付けられたカスタマイザに渡されます。
クラスを個別パッケージから探す場合とサブアプリケーションパッケージから探す場合で検出の条件は異なります。
クラスの検出条件
|
パッケージ名に関する条件 |
クラス名に関する条件 |
個別パッケージから見つける場合 | クラスのパッケージ名が「ルートパッケージ名.サフィックスを小文字にした文字列」で始まっている | クラス名がサフィックス、もしくはサフィックスとImplを連結した文字列で終わっている |
サブアプリケーションから見つける場合 | クラスのパッケージ名が「ルートパッケージ名.web」で始まっている | クラス名がサフィックス、もしくはサフィックスとImplを連結した文字列で終わっている |
ルートパッケージ、個別パッケージ、サブアプリケーションの説明についてはSMART deployを参照してください。
S2Containerにはdefault-customizer.diconに定義されたデフォルトカスタマイザとstd-customizer.diconに定義された標準カスタマイザがあらかじめ用意されています。
アプリケーションで定義するカスタマイザはcustomizer.diconに記述してください。
デフォルトカスタマイザはクリエータに関連付けられるカスタマイザです。
クリエータがコンポーネント定義を作成したあとにこれらのカスタマイザが呼び出されます。
デフォルトカスタマイザには以下のコンポーネントがあります。
コンポーネント名 | 説明 |
actionCustomizer | Action用のカスタマイザ |
converterCustomizer | Converter用のカスタマイザ |
daoCustomizer | Dao用のカスタマイザ |
dtoCustomizer | Dto用のカスタマイザ |
dxoCustomizer | Dxoカスタマイザ |
helperCustomizer | Helper用のカスタマイザ |
logicCustomizer | Logic用のカスタマイザ |
interceptorCustomizer | Interceptor用のカスタマイザ |
pageCustomizer | Page用のカスタマイザ |
serviceCustomizer | Service用のカスタマイザ |
validatorCustomizer | Validator用のカスタマイザ |
これらのコンポーネントのクラスはorg.seasar.framework.container.customizer.CustomizerChain です。
CustomizerChain には任意の数のカスタマイザを設定(チェイン)可能ですが、デフォルトカスタマイザのコンポーネントには何も設定されていません。
したがって、デフォルトカスタマイザはクリエータから呼び出されても何の処理も実行しません。
デフォルトカスタマイザがそのように定義されている理由は、カスタマイザをどのように設定するかはアプリケーション開発者に委ねられているからです。
カスタマイザの設定はデフォルトカスタマイザの設定を上書きする形でcustomizer.diconに記述します。
その設定は通常CustomizerChain に任意の標準カスタマイザを追加することで行います。
標準カスタマイザはアプリケーションで定義するカスタマイザの設定に標準的に利用されることを想定したコンポーネントです。
標準カスタマイザには以下のコンポーネントがあります。
コンポーネント名 | 関連付けられたインターセプト名 | 説明 |
traceCustomizer | aop.traceInterceptor | トレース出力のためのカスタマイザ |
simpleTraceCustomizer | aop.simpleTraceInterceptor | 引数や戻り値を出力しない単純なトレースのためのカスタマイザ |
classLoaderAwareTraceCustomizer | aop.classLoaderAwareTraceInterceptor | クラスローダーの情報を含めたトレース出力のためのカスタマイザ |
syncCustomizer | aop.syncInterceptor | 同期処理のためのカスタマイザ |
traceThrowsCustomizer | aop.traceThrowsInterceptor | 例外のトレース出力のためのカスタマイザ |
toStringCustomizer | aop.toStringInterceptor | オブジェクトのフィールドの値を文字列化するためのカスタマイザ |
removeSessionCustomizer | aop.removeSessionInterceptor | メソッドの実行後にHTTPセッションから属性を削除するためのカスタマイザ |
commandTraceCustomizer | aop.traceInterceptor | do.*, initialize, prerenderをポイントカットとしてトレース出力するカスタマイザ |
requiredTxCustomizer | j2ee.requiredTx | Requiredのトランザクション属性を有効にするためのカスタマイザ |
requiresNewTxCustomizer | j2ee.requiresNewTx | RequiresNewのトランザクション属性を有効にするためのカスタマイザ |
mandatoryTxCustomizer | j2ee.mandatoryTx | Mandatoryのトランザクション属性を有効にするためのカスタマイザ |
notSupportedTxCustomizer | j2ee.notSupportedTx | NotSupportedのトランザクション属性を有効にするためのカスタマイザ |
neverTxCustomizer | j2ee.neverTx | Neverのトランザクション属性を有効にするためのカスタマイザ |
s2DxoCustomizer | dxo.interceptor | Dxoを利用するためのカスタマイザ |
s2DaoCustomizer | dao.interceptor | S2Daoを利用するためのカスタマイザ |
kuinaDaoCustomizer | kuinaDao.interceptor | Kuina-Daoを利用するためのカスタマイザ |
これらのコンポーネントのクラスはorg.seasar.framework.container.customizer.AspectCustomizer です。
AspectCustomizer はコンポーネント定義にアスペクト定義を登録するカスタマイザです。
標準カスタマイザはインターセプタと関連づけられています。
実行時、標準カスタマイザは関連付けられたインターセプタからアスペクト定義を作成しコンポーネント定義に登録します。
標準カスタマイザはアプリケーション開発者がcusomizer.diconに定義するCustomizerChain に設定して利用すべきものです。
アプリケーションで使用するカスタマイザの設定はcustomizer.diconに定義します。
例えば、サービスのコンポーネントに標準のカスタマイザであるtraceCustomizer とtraceThrowsCustomizer を適用する場合、次のように記述します。
<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はデフォルトでトランザクション制御を行う機能が備わっているのでcusomizer.diconに対する設定は不要です。
S2ContainerのEJB 3.0サポートについてはEJB3.0 Simplified APIを参照してください。
インターセプタを適用するAspectCustomizer のuseLookupAdapter プロパティに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で複数データソースに対応するには?を参照してください。
|