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気持ち悪い)は我慢するということで。