【问题标题】:Injecting EJB into servlet via remote interface通过远程接口将 EJB 注入 servlet
【发布时间】:2013-04-12 14:52:48
【问题描述】:

我正在查看一些 Jave EE 6 代码并对其正确性存有疑问:

@WebServlet
public class FooServlet {
  @EJB
  private transient BarRemoteInterface bar;
}

@Remote
public interface BarRemoteInterface {
}

@Stateless
public class BarBean implements BarRemoteInterface {
}
  • 我想知道transient 关键字是否没有任何意义,因为注入的代理不会被序列化。 (或者会,但没有效果?)

  • 我认为如果我们不注入远程接口会更有效,因为它使用传递复制参数传递。相反,我们宁愿用@EJB BarBean 注入EJB,以便使用它自动生成的(?)本地接口。我说的对吗?

  • 在这种情况下,即使@EJB 也可以替换为@Inject,因为这样更通用

如果我的想法是正确的,你能评论一下吗?

【问题讨论】:

    标签: java ejb cdi


    【解决方案1】:

    我想知道瞬态关键字是否确实如此 有任何意义,因为注入的代理不会被序列化。 (或者会 是,但没有效果?)

    不需要瞬态。 EJB 规范说远程代理必须是可序列化的。如果你愿意,你可以让你的接口扩展 Serializable。

    我认为如果我们不注入遥控器会更有效 接口,因为它使用按副本传递参数传递。相反,我们会 而是使用@EJB BarBean 注入EJB,以便它自动进行 将使用生成的 (?) 本地接口。我说的对吗?

    对,@Remote 本质上是“通过复制”(不是真的,但这已经足够接近了)。无论如何,一些应用程序容器可以对此进行优化。如果您实际上是远程处理,您应该只使用@Remote。你应该不惜一切代价避免远程处理。类似 SOA 的架构速度很慢,而且众所周知不可能向外扩展。坚持使用@Local,除非你有充分的理由不这样做。

    在这种情况下,即使 @EJB 也可以替换为 @Inject 更通用

    是的,请随时 @Inject 您的 EJB。您的 JEE6 容器(TomEE、JBoss7、GlassFish 等)将能够解决这个问题。事实上,您应该问自己,我真的需要 EJB 吗?你能用纯 CDI 完成你的任务吗? EJB 仅在您必须担心事务语义时才有用,否则只需使用 CDI。

    希望对你有帮助!

    【讨论】:

    • 不错的答案。有时@Remote 是必须的(例如,如果在不同的 EAR 之间进行通信)。我前段时间在我的博客here 上对此进行了描述。如果您对实例池、事务或计时器不感兴趣(从我的脑海中),CDI 很好。
    • 谢谢,尤其是在这种情况下,我们有两个 EAR,所以最后我们需要@Remote。不管怎样,我从你们那里学到了很多,所以谢谢。
    • 尝试将耳朵和基准与@Local 结合起来。你会惊讶于你的性能提升。然后做同样的事情,看看你的垃圾收集统计数据。 :D 祝你好运,不客气
    猜你喜欢
    • 2012-05-11
    • 2017-03-13
    • 1970-01-01
    • 2017-11-21
    • 2014-04-25
    • 1970-01-01
    • 2020-09-03
    • 1970-01-01
    • 2011-02-12
    相关资源
    最近更新 更多