HotDeploy + アスペクト
shotさんに教えていただいた通り、AspectCustomizerを使えばOKでした!
AspectCustomizerはComponentCustomizerのサブクラスで、対象のコンポーネント定義にアスペクト定義を追加するカスタマイザです。
で、これはCreatorに登録します。
具体的には↓こんな感じ。いわゆるjpetstoreの例です。
<?xml version="1.0" encoding="Shift_JIS"?> <!DOCTYPE components PUBLIC "-//SEASAR2.1//DTD S2Container//EN" "http://www.seasar.org/dtd/components21.dtd"> <components> <include path="aop.dicon"/> <include path="j2ee.dicon"/> <include path="dao.dicon"/> <component class="org.seasar.dao.impl.DaoMetaDataFactoryImpl"/> <component class="org.seasar.framework.container.hotdeploy.OndemandBehavior"> <property name="rootPackageName">"jpetstore"</property> <initMethod name="addCreator"> <arg> <component class="org.seasar.framework.container.hotdeploy.creator.InterfaceCentricSinglePackageCreator"> <property name="middlePackageName">"presentation.page"</property> <property name="nameSuffix">"Page"</property> <property name="instanceDef">@org.seasar.framework.container.deployer.InstanceDefFactory@REQUEST</property> </component> </arg> </initMethod> <initMethod name="addCreator"> <arg> <component class="org.seasar.framework.container.hotdeploy.creator.InterfaceCentricSinglePackageCreator"> <property name="middlePackageName">"business"</property> <property name="nameSuffix">"Service"</property> <property name="instanceDef">@org.seasar.framework.container.deployer.InstanceDefFactory@PROTOTYPE</property> <initMethod name="addCustomizer" ><arg>txAspectCustomizer</arg></initMethod> </component> </arg> </initMethod> <initMethod name="addCreator"> <arg> <component class="org.seasar.framework.container.hotdeploy.creator.InterfaceCentricSinglePackageCreator"> <property name="middlePackageName">"integration.dao"</property> <property name="nameSuffix">"Dao"</property> <property name="instanceDef">@org.seasar.framework.container.deployer.InstanceDefFactory@PROTOTYPE</property> <initMethod name="addCustomizer" ><arg>daoAspectCustomizer</arg></initMethod> →★ここ!! </component> </arg> </initMethod> </component> <component name="daoAspectCustomizer" class="org.seasar.framework.container.autoregister.AspectCustomizer"> <property name="interceptor">dao.interceptor</property> </component> <component name="txAspectCustomizer" class="org.seasar.framework.container.autoregister.AspectCustomizer"> <property name="interceptor">j2ee.requiredTx</property> </component> </components>
こんな感じで書くと、期待通りアスペクトがかかるようになりました。
で、一瞬うまいことサービスが実行できた!?とか思ったんですが、微妙に挙動が変でして。
調整しようとdiconをなんかいじってたら↓のようなエラーがでるようになってしまいました。
元に戻せない...。orz
何をやったっけ?
エラーの内容は、このDaoの一つにAbstractDaoの実装サブクラスがあるのですが、そいつを実行しようとするときに
(interface org.seasar.dao.DaoMetaDataFactory)が見つからないのでnullを設定します
となってしまうというもの。
dao.diconをincludeしてるんですけどねぇ。