EJB 3.0のインスタンス変数インジェクションについて
勉強会でみなさんの意見を伺ってみました。privateなインスタンス変数にインジェクションできることについてどう思う?
- (反対意見)privateなfieldにinjection気持ち悪い
- (反対意見)テストがしにくくなるからprivateなfieldにinjectionありえない
- (賛成意見)setter methodよりinstance変数にアノテーションがついていたほうが見やすい
2番目と3番目の意見を両立させるためにインスタンス変数インジェクションを使うがテスト用にsetter methodを用意すればいいという意見が出ました。なるほど。こうですね。
@Stateless @Remote(EmployeeLogic.class) public class EmployeeLogicBean implements EmployeeLogic { @EJB private EmployeeDao dao; @Resource private SessionContext ctx; public void setCtx(SessionContext ctx) { this.ctx = ctx; } public void setDao(EmployeeDao dao) { this.dao = dao; } public void insert(int no, String name) throws MyException { dao.insert(no, name); } }
こっちはセッターインジェクション使っています。たしかにこっちよりもインスタンス変数のところにアノテーションがあったほうが見やすい。
@Stateless @Remote(EmployeeLogic.class) public class EmployeeLogicBean implements EmployeeLogic { private EmployeeDao dao; private SessionContext ctx; @EJB public void setDao(EmployeeDao dao) { this.dao = dao; } @Resource public void setCtx(SessionContext ctx) { this.ctx = ctx; } public void insert(int no, String name) throws MyException { dao.insert(no, name); } }
1番目の意見(privateなfieldにinjection気持ち悪い)は我慢するということで。