Java EJB3-通过注入和查找获取bean-有什么区别、含义和问题?

Java EJB3-通过注入和查找获取bean-有什么区别、含义和问题?,java,ejb-3.0,Java,Ejb 3.0,我知道有两种方法可以获得EJB实例: 通过@EJB注释在servlet和EJB中注入依赖项 通过Context.lookup anywhere查找JNDI 使用这两种方法的区别、含义和局限性是什么?它们是一样的吗?依赖注入比查找快吗?事务处理和对象生命周期管理如何 我知道的事情包括: 注释 仅适用于servlet和EJB 方便的语法 容器独立 查找 可以在运行时以编程方式实例化EJB接口的不同实现 在任何地方工作-例如,POJOs 取决于容器的命名约定 查找取决于JNDI实现的存在,也

我知道有两种方法可以获得EJB实例:

  • 通过@EJB注释在servlet和EJB中注入依赖项
  • 通过Context.lookup anywhere查找JNDI
使用这两种方法的区别、含义和局限性是什么?它们是一样的吗?依赖注入比查找快吗?事务处理和对象生命周期管理如何

我知道的事情包括:

注释

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

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

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

两者都可以获得相同的结果。这更多的是一个耦合的问题。通过注释,可以实现松散耦合,并且更容易进行模拟和测试。使用直接查找时,您依赖于初始上下文,这有时可能并不令人信服

IMHO查找不适用于任何地方。例如,在Glassfish中,只有在使用POJO的其中一个会话bean上使用
@EJBs(…)
“导入”了本地EJB之后,从POJO中查找本地EJB才会起作用。看见为此,您需要了解本地全局JNDI之间的区别


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

我认为模仿带注释的EJB有点困难。使用lookup时,您可以根据您的环境构建一些交换机(test->LoginMockBean,production->LoginBean)。

这是错误的。如果它是由容器注入的,这意味着您可以更轻松地在测试中自己注入它,例如
MyBean=newmybean();bean.injectedBean=new Mock()
。查找中的挂钩更为复杂,尤其是当代码依赖于
new InitialContext()
时。如何为测试返回上下文的特殊版本?