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メソッドで依存クラスを直接取り出すよりは良いと思う。