java - EJB3 - 通过注入(inject)与查找获取 bean - 有什么区别、含义和陷阱?

标签 java ejb-3.0

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

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

使用这两种方法中的任何一种有什么区别、含义和问题?它们相同吗?依赖注入(inject)比查找快吗?事务处理和对象生命周期管理呢?

我知道的事情包括:

注释

  • 仅适用于 servlet 和 EJB
  • 方便的语法
  • 容器无关

查找

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

最佳答案

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

恕我直言,查找并非在任何地方都有效。例如,在 Glassfish 中,仅当先前使用 @EJBs(...) 在使用 POJO 的 session bean 之一上“导入”时,从 POJO 对本地 EJB 的查找才有效。参见 this discussion .为此,您需要了解localglobal JNDI 之间的区别。

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

关于java - EJB3 - 通过注入(inject)与查找获取 bean - 有什么区别、含义和陷阱?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2085679/

相关文章:

java - 缺少/不可用依赖项的服务

java - EJB3 计时器是否继承到创建它们的 bean?

java - 如何向 EJB 3.0 服务器验证应用程序客户端的身份

java - Lightbend Lagom - 如何重构 Java EE 整体架构

java - intent startActivity 的奇怪问题导致我的扫描仪无法正常工作

java - 如何在 Java 中将 JavaScript 日期转换为日期?

java - org.hibernate.MappingException : Unknown entity

java - SCJP 需要适当的指导

java - 确定JAVA-EE应用程序模块调用了哪些拦截方法

java - @TransactionAttribute 的默认值