中々厳しい所を突いて下さる方がいらっしゃるようです。

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;
	}