中々厳しい所を突いて下さる方がいらっしゃるようです。
id:hiroyoshioさんが、S2Containerのちょっと不思議な動きに気付いて下さったようです。
詳細は…、hiroyoshioさんの日記で。ここでは結論だけ言います。
SingletonComponentDeployerのinitとdestroyの処理内容に対応関係が無いのが原因です。
確かに、良く見てみると不思議な感じがします。
initではインスタンスの生成を行っていますが、destroyではその参照をnullにしていません。
destroyの最初でcomponentの参照がnullの場合、destroyの処理をしないようになっているにも関わらず…です。
僕の感覚的には、destoryメソッドの最終行で、componentの参照にnullを詰めても良いかナァ…と思います。
それによって、id:hiroyoshioさんのおっしゃる通りの動作になります。
つまり、同一の参照を持つcomponentのinitMethod及び、
destoryMethodはそれぞれ1回ずつしか動作しない様になります。
ちなみに修正後の、SingletonComponentDeployer#destroyはこの様になるかと思います。
public void destroy() { if (component_ == null) { return; } getDestroyMethodAssembler().assemble(component_); component_ = null; }