Seasar2のouter

Seasar2インスタンス管理にはouterという指定がある。ドキュメントによると

コンポーネントインスタンスは、S2Container外で作成し、Dependency Injectionだけを行います。アスペクト、コンストラクタ・インジェクションは適用できません。

これはどう使うのか。DIコンテナで生成できないインスタンスに対して依存性の解決をDIコンテナにお願いする場合に使えばいいのだろうか。例えば、サーブレットコンテナがインスタンスを生成、管理しているようなクラス。代表的なものはサーブレットそのものだ。

diconファイルでサーブレットクラスにouterを指定をして…

<component name="testServlet" class="test.TestServlet" instance="outer"/>
<component name="dependency" class="test.DependencyImpl" instance="singleton"/>

サーブレットクラスのinitでS2Containerに依存性解決をお願いする

public class TestServlet extends HttpServlet {    
    @Override
    public void init() throws ServletException {
        // 依存性を解決
        S2Container c = SingletonS2ContainerFactory.getContainer();
        c.injectDependency(this);
        super.init();
    }
    
    // 依存性
    private Dependency dep;
    
    // セッターインジェクションメソッド
    public void setDependency(Dependency dep) {
        this.dep = dep;
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
        res.setContentType("text/plain");
        PrintWriter p = res.getWriter();
        p.print(this.dep.getString());
    }
}

outerで作成したインスタンスの依存性解決には、injectDependencyメソッドを使うらしい。getComponentメソッドで依存クラスを直接取り出すよりは良いと思う。