HOT deploy


なるほど。
org.seasar.framework.container.hotdeploy.HotDeployFilterで
その中でOndemandBehaviorをS2から取り出すと。
(そういえば初期設定のdiconファイルが増えてますね。
s2container.diconて名前みたい。これはデフォで追加しなくちゃいけないのかな?)

<component class="org.seasar.framework.container.hotdeploy.OndemandBehavior">
	<property name="rootPackageName">"examples.hotdeploy"</property>
	<initMethod name="addCreator">
		<arg>
			<component class="org.seasar.framework.container.hotdeploy.creator.ActionCreator"/>
		</arg>
	</initMethod>
	<initMethod name="addCreator">
		<arg>
			<component class="org.seasar.framework.container.hotdeploy.creator.DtoCreator"/>
		</arg>
	</initMethod>
</component>

rootPackageNameは、HOT Deploy対象とするパッケージのrootと
なってるということですね。
で、このCreatorに指定したものだけがHOT Deployの対象になるということですね。
これがすばやい処理の秘密っぽい。
適切な対象のみをHot Deployさせると。


HotdeployFilterでは、start()でClassLoaderを
HotDeployClassLoaderにして、end()で元に戻すのですね。

        ondemand.start();
        try {
            chain.doFilter(request, response);
        } finally {
            ondemand.stop();
        }


OndemandBehaviorは、HotdeployListenerというインタフェースを
実装しています。HotDeployClassLoaderはこのリスナーを登録して
呼び出します。


HotdeployClassLoaderのloadClassでは、
このHotdeployListener.definedClass()を呼び出していて
OndemandBehaviorクラスで最終的に、OndemandCreator.loadComponentDef()で
Componentをregisterしなおしています。
Creatorクラスは、以下のようなものを設定するして、DIしてやります。
 ・パッケージ名の途中に含まれる名前(Actionだったらwebみたいな)
 ・クラス名のsuffix(ActionとかDtoとか)
 ・インスタンスモード(REQUESTとか、Singletonとか)
 ・AutoBindingモード
ふむふむ。

loadComponentDef()は実際はAbstractOndemandCreatorにあります。
ここでAnnotationもかけなおしているので、S2のアノテーションはかかります。


では、Teedaなど他プロダクトのAnnotationは?
ここにも一工夫入ってますね。
Customizerというインタフェースを実装したクラスをDIできるように
なっていて、ここでカスタマイズ可能になっています。
Customizer.customize(ComponentDef)なので、ComponentDefさえ
扱えれば後は好きにし放題です。


まとめとして、
HOT deploy機能で見なきゃいけないのは、
 ・s2container.dicon
 ・org.seasar.framework.container.hotdeploy.OndemandBehavior
 ・org.seasar.framework.container.hotdeploy.creator.AbstractOndemandCreator
 ・org.seasar.framework.container.hotdeploy.HotdeployFilter

くらいで概要つかめると思います。
あとは適宜Creatorとかみれば。