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とかみれば。