我知道有两种获取 EJB 实例的方法:
- 通过@EJB 注释在 servlet 和 EJB 中进行依赖注入(inject)
- 通过 Context.lookup 在任何地方进行 JNDI 查找
使用这两种方法中的任何一种有什么区别、含义和问题?它们相同吗?依赖注入(inject)比查找快吗?事务处理和对象生命周期管理呢?
我知道的事情包括:
注释
- 仅适用于 servlet 和 EJB
- 方便的语法
- 容器无关
查找
- 可以在运行时以编程方式实例化 EJB 接口(interface)的不同实现。
- 可在任何地方工作 - 例如POJO。
- 取决于容器的命名约定
最佳答案
两者都达到相同的结果。这更像是一个耦合的问题。使用注释,您可以实现松耦合,并且更容易模拟和测试。使用直接查找,您依赖于初始上下文,这有时可能不方便。
恕我直言,查找并非在任何地方都有效。例如,在 Glassfish 中,仅当先前使用 @EJBs(...)
在使用 POJO 的 session bean 之一上“导入”时,从 POJO 对本地 EJB 的查找才有效。参见 this discussion .为此,您需要了解local 和global JNDI 之间的区别。
我的建议是:尽可能使用注释。如果 POJO 需要对 EJB 的引用,请将其作为参数传递(例如在构造函数中)。这称为依赖倒置,无论如何都是一种很好的做法。
关于java - EJB3 - 通过注入(inject)与查找获取 bean - 有什么区别、含义和陷阱?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2085679/