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環境でも期待通り動かすためには、タグを利用して明示的にS2Containerへ登録する必要があります。
Seasar2のコードを眺めてみると、HotDeploy時の動作として、既にS2Containerに登録されているコンポーネントについては、
登録を行わず、既に登録されていたものを返す実装になっているようなので、問題なさそうです。


CoolDeployとHotDeployで動作が違ってくる現象は、とてもやっかいな問題になることが多いのですが
逆にいえばフレームワークの仕組みを深く理解できるチャンスだと思っています。