Pleiadesの作者の言っていることは割と正論。

JDK5以降ならクラスのロードをフックできるので、
Hogeというクラスのロードが要求されたら、
フックした側でバイトコードを換えればよい。

例えばHogeインターフェイスとHogeImpl1とHogeImpl2があれば、
テスト時はHogeImpl1で本番時はHogeImpl2という風にも可能。
これは既存のDIでも出来る話であるが、利用コード側が、

Hoge hoge = new HogeImpl1();
か、
Hoge hoge = (Hoge)container.getComponent(Hoge.class);

の違いではあるが、Hogeは業務に関係あるものでも、
containerは業務に無関係で、DIコンテナの為に仕方がなく使っているもの。

ぶちゃけ、Seasar2を使って組んだ業務システムをリプレイスするときを考えてみろ。
業務に関係ないコードが点々と存在して、
インスタンスのライフサイクルもコードからは追いかけられないんだぞ。
他人が作ったメソッドで取得したハッシュマップからインスタンスを取得するときに、
ライフサイクルとか、正しいインスタンスなのか、自信がもてないだろ。