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

Con*_*nor 9 java ejb-3.0

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

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

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

我所知道的事情包括:

注解

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

抬头

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

ewe*_*nli 6

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

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

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


axt*_*avt 2

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