我正在审查一些Jave EE 6代码,并怀疑它的正确性:
@WebServlet
public class FooServlet {
@EJB
private transient BarRemoteInterface bar;
}
@Remote
public interface BarRemoteInterface {
}
@Stateless
public class BarBean implements BarRemoteInterface {
}
我想知道transient
关键字是否属实,因为注入的代理不会被序列化。 (或将会,但没有效果?)
我认为如果我们不使用pass-by-copy参数传递注入远程接口会更有效。相反,我们宁愿用@EJB BarBean
注入EJB,以便使用它自动生成(?)本地接口。我是对的吗?
在这种情况下,即使@EJB
可以替换为@Inject
,因为这更为一般
如果他们是正确的,你能评论我的想法吗?
答案 0 :(得分:3)
我想知道transient关键字是否属实 因为注入的代理不会被序列化,所以有意义。 (或者会 是,但没有效果?)
不需要瞬态。 EJB规范说远程代理必须是可序列化的。如果需要,可以让您的界面扩展Serializable。
我认为如果我们不注射遥控器会更有效 接口,因为它使用pass-by-copy参数传递。相反,我们 而是使用@EJB BarBean注入EJB,以便它自动化 生成(?)本地接口将被使用。我是对的吗?
是的,@Remote
基本上是'传递副本'(不是真的,但这已足够接近了)。一些应用容器无论如何都可以优化它。如果您实际进行远程处理,则应该只使用@Remote
。你应该不惜一切代价避免远程操作。类似SOA的架构很慢,而且众所周知不可能扩展。只要坚持@Local
,除非你有充分的理由不这样做。
在这种情况下,甚至@EJB也可以用@Inject替换 更一般的
是的,请随意@Inject
您的EJB。您的JEE6容器(TomEE,JBoss7,GlassFish等)将能够解决这个问题。事实上,你应该问自己,我真的需要一个EJB吗?你能用纯CDI完成你的任务吗?只有在必须担心事务语义时才使用EJB,否则只使用CDI。
我希望有所帮助!