Java 通过远程接口将EJB注入servlet
我正在查看一些Jave EE 6代码,对其正确性有疑问: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
@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
@Remote
本质上是“通过拷贝传递”(不是真的,但这已经足够接近了)。一些应用程序容器无论如何都可以对此进行优化。只有在实际远程处理时,才应使用@Remote
。你应该不惜一切代价避免远程通信。类似SOA的架构速度很慢,而且众所周知不可能扩展。只要坚持使用@Local
,除非你有很好的理由不这么做
在这种情况下,甚至可以用@Inject替换@EJB
更一般
是的,请随意@注入您的EJB。您的JEE6容器(TomEE、JBoss7、GlassFish等)将能够解决这个问题。事实上,您应该问问自己,我真的需要EJB吗?你能用纯CDI完成你的任务吗?EJB只有在您必须担心事务语义时才有用,否则只需使用CDI即可
我希望这有帮助 回答得好。有时必须使用@Remote
(例如,如果在不同的耳朵之间进行通信)。我不久前在我的博客上描述过这一点。如果你对实例池、事务或计时器不感兴趣(从我的头顶上看),CDI很好。谢谢,特别是在这个例子中,我们有两个EAR,所以最后证明我们需要@Remote。无论如何,我从你们身上学到了很多,所以谢谢。试着把耳朵和基准测试与@Local结合起来。你会对你的表现感到惊讶。然后做同样的事情,看看你的垃圾收集统计数据祝你好运,不客气