2

我正在查看一些 Jave EE 6 代码并对它的正确性表示怀疑:

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

@Remote
public interface BarRemoteInterface {
}

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

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

  • 在这种情况下,甚至@EJB可以替换@Inject为更通用的

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

4

1 回答 1

3

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

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

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

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

在这种情况下,甚至@EJB 也可以替换为@Inject,因为这更通用

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

我希望这会有所帮助!

于 2013-04-12T16:51:09.427 回答