CoolDeployとHotDeployのトラブルについて知りたい(2)
昨日(id:sikakura:20110113)の続きですが、今度はCoolDeploy時には動作するけど、HotDeploy時に動作しないパターンです。
あるインターフェースを実装したクラスを連続で実行したいという要件があった場合に以下のようなコーディングをしていたケースです。
public interface DinjectionMapper { public String hello(); } public class AinjectionMapperImpl implements DinjectionMapper { @Override public String hello() { return new String("My name is A."); } } public class BinjectionMapperImpl implements DinjectionMapper { @Override public String hello() { return new String("My name is B."); } } public class CinjectionMapperImpl implements DinjectionMapper { @Override public String hello() { return new String("My name is C."); } } public class SearchController { public void initialize(RequestModel request) { ComponentDef[] defs = s2Container.getRoot().findAllComponentDefs(DinjectionMapper.class); for (ComponentDef def : defs) { DinjectionMapper d = (DinjectionMapper) def.getComponent(); d.AllHello(); } } }
上のコーディング例ではCoolDeployでは期待通り動作しますが、HotDeploy環境下では動作しないケースがあります。
HotDeploy環境でも期待通り動かすためには、
Seasar2のコードを眺めてみると、HotDeploy時の動作として、既にS2Containerに登録されているコンポーネントについては、
登録を行わず、既に登録されていたものを返す実装になっているようなので、問題なさそうです。
CoolDeployとHotDeployで動作が違ってくる現象は、とてもやっかいな問題になることが多いのですが
逆にいえばフレームワークの仕組みを深く理解できるチャンスだと思っています。