EJB3 – 通过注入和查找获取bean – 有什么区别,含义,陷阱?

我知道有两种获取EJB实例的方法:

  • 通过@EJB注释在servlet和EJB中进行dependency injection
  • 通过Context.lookup在任何地方进行JNDI查找

使用这两种方法有什么不同,含义和陷阱? 它们是一样的吗? dependency injection比查找更快吗? 那么事务处理和对象生命周期管理呢?

我所知道的事情包括:

注解

  • 仅适用于servlet和EJB
  • 方便的语法
  • 容器独立

抬头

  • 可以在运行时以编程方式实例化EJB接口的不同实现。
  • 适用于任何地方 – 例如POJO。
  • 取决于容器的命名约定

两者都达到了相同的效果。 这更多是耦合问题 。 使用注释,您可以实现松散耦合,并且更容易进行模拟和测试。 通过直接查找,您可以依赖于有时可能不方便的初始上下文。

恕我直言查找无处不在 。 例如,在Glassfish中,只有先前使用@EJBs(...)在其中一个使用POJO的会话bean上“导入”, @EJBs(...)从POJO查找本地EJB。 看到这个讨论 。 您需要了解本地全局 JNDI之间的区别。

我的建议是:尽可能使用注释。 如果POJO需要对EJB的引用,则将其作为参数传递(例如,在构造函数中)。 这就是所谓的依赖倒置,无论如何都是一种好的做法。

查找依赖于JNDI实现的存在,也就是说,您必须配置JNDI实现才能运行unit testing,然后可以手动配置带注释的字段。

我认为模拟带注释的EJB很难。 使用查找时,您可以根据您的环境构建一些开关(test – > LoginMockBean,production – > LoginBean)。