[Seasar-user:16915] Re: [Seasar] HOT deploy と COOL deploy の挙動の違いを教えて頂けないでしょうか

Koichi Kobayashi [E-MAIL ADDRESS DELETED]
2009年 2月 13日 (金) 21:00:04 JST


小林 (koichik) です.

Date:    Fri, 13 Feb 2009 19:19:30 +0900
From:    "Tsutomu Uchima" <[E-MAIL ADDRESS DELETED]>
To:      <[E-MAIL ADDRESS DELETED]>
Subject: [Seasar-user:16913] [Seasar] HOT deploy と COOL deploy の挙動の違いを教えて頂けないでしょうか

> 今後のために開発時に意識すべき HOT deploy と COOL deploy の挙動の違いを教え
> て頂けませんでしょうか。もしくはHOT deploy と COOL deploy の挙動が等価となる
> ような設計指針があればご指導下さい。

詳細はドキュメントに書かないといけないと
思ってますが,とりあえず簡単に.

■ SMART deploy 対象・非対象を明確に分ける

アプリケーション全体を SMART deploy 対象に
するのではなく,その一部だけを SMART deploy
対象にする.
例えばアプリケーション全体のパッケージが

jp.co.xxx.yyyy.〜

である場合,SMART deploy のルートパッケージは

jp.co.xxx.yyyy.smart

のようにする.

その上で,SMART deploy 非対象クラスから
SMART deploy 対象クラスは参照しない.

できれば (IDE における) プロジェクトを別に
してしまい,SMART deploy 非対象プロジェクトは
SMART deploy 対象プロジェクトを参照できなくする.

SMART deploy 非対象となるのは,Servlet や
Filter など Seasar2 で管理されないクラスや,
dicon ファイルに定義されるクラス,および
それらのクラスから参照されるクラスです.

これは HOT deploy で ClassCastException や
LinkageError を避けるために必要です.

以下は SMART deploy 対象クラスについての指針です.

■ 具象クラスから継承しない

継承する場合は必ず抽象クラスを継承する.
つまり,全てのクラスは abstract か final
であるかのようにする.
# 実際に final を指定すると AOP を適用
# できなくなるので注意.

これは,COOL deploy でのみ TooManyRegistration〜 に
なったり,自動バインディングされないことを
避けるために必要です.

■ HttpSession を直接使用しない

SMART deploy 対象クラスを HttpSession から
取得する場合は,HttpSession を直接使わず 
sessionScope プロパティを使用する.

  public Map<String, Object> sessionScope;

同じように,ServletContext は applicationScope
プロパティを使用する.

  public Map<String, Object> applicationScope;

これは,HOT deploy 時に HttpSession から
オブジェクトを取得して ClassCastException が
発生することを避けるために必要です.


すぐに思いついたのは以上です.
他に (バッド) ノウハウをお持ちの方は
レスいただけると助かります.


-- 
<component name="koichik">
    <property name="fullName">"Koichi Kobayashi"</property>
    <property name="email">"[E-MAIL ADDRESS DELETED]"</property>
    <property name="blog">"http://d.hatena.ne.jp/koichik"</property>
</component>



Seasar-user メーリングリストの案内