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

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してるんですけどねぇ。