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

时间:2010-01-18 11:37:21

标签: java ejb-3.0

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

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

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

我所知道的事情包括:

注释

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

查找

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

3 个答案:

答案 0 :(得分:6)

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

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

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

答案 1 :(得分:2)

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

答案 2 :(得分:0)

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