Java 通过远程接口将EJB注入servlet

Java 通过远程接口将EJB注入servlet,java,ejb,cdi,Java,Ejb,Cdi,我正在查看一些Jave EE 6代码,对其正确性有疑问: @WebServlet public class FooServlet { @EJB private transient BarRemoteInterface bar; } @Remote public interface BarRemoteInterface { } @Stateless public class BarBean implements BarRemoteInterface { } 我想知道transien

我正在查看一些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
    ,因为这更一般

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

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

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

我认为如果我们不注射遥控器会更有效 使用通过复制传递参数的接口as。相反,我们 而是用@EJBBarBean注入EJB,这样它就可以自动运行了 将使用生成的(?)本地接口。我说得对吗

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

在这种情况下,甚至可以用@Inject替换@EJB 更一般

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


我希望这有帮助

回答得好。有时必须使用
@Remote
(例如,如果在不同的耳朵之间进行通信)。我不久前在我的博客上描述过这一点。如果你对实例池、事务或计时器不感兴趣(从我的头顶上看),CDI很好。谢谢,特别是在这个例子中,我们有两个EAR,所以最后证明我们需要@Remote。无论如何,我从你们身上学到了很多,所以谢谢。试着把耳朵和基准测试与@Local结合起来。你会对你的表现感到惊讶。然后做同样的事情,看看你的垃圾收集统计数据祝你好运,不客气