[英]EJB 3.1 @LocalBean vs no annotation
我理解本地视图,远程视图和无界面视图之间的区别。 我只是不明白“无视图”(无注释)和无界面视图之间的区别。 还有为什么我要用@Local
注释我的界面? 如果我根本不对界面进行注释会有什么不同呢?
规则是(来自记忆):
@LocalBean
注释 - > bean有一个无界面视图 @Local
注释 - > bean有一个本地视图 @Remote
注释 - > bean有一个远程视图 因此,使用@LocalBean
并且根本不使用注释都是获得无界面视图的两种方式。 如果您只想要一个无界面视图,那么最简单的事情就是不要注释。 如果您还没有实现任何接口。
@LocalBean
存在的部分原因是为具有接口视图的bean添加无接口视图。 我想在规范作者的头脑中最重要的场景就是你有一个像你这样的bean:
@Stateless
public class UserPreferences {
public String getPreference(String preferenceName);
public Map<String, String> getPreferences();
}
您希望在本地公开这两种方法的位置,但只能远程显示粗粒度的getPreferences()
。 您可以通过仅使用该方法声明远程接口,然后在bean类上@LocalBean
来实现。 没有它,你必须编写一个无意义的本地接口,只是为了在本地公开这两种方法。
或者,从另一个角度来看,@ @LocalBean
存在,因为存在无界面视图这样的东西,并且no-annotation选项作为便捷的快捷方式存在。
本地/无接口视图比远程EJB更有效,因为可以传递对象引用。
我认为你/我们感到的困惑是历史/向后兼容性的结果(可以这么说)。 我无法区分任何差异(除非规范要求实现在我们使用本地视图时创建接口)
无接口视图与EJB 3.0本地视图具有相同的行为,例如,它支持诸如传递引用调用语义以及事务和安全传播之类的功能。 但是,无接口视图不需要单独的接口,也就是说,bean类的所有公共方法都会自动向调用者公开。 默认情况下,任何具有空implements子句且未定义任何其他本地或远程客户端视图的会话Bean都会公开无接口客户端视图。
如果您对更多技术细节感兴趣,请告诉我们真正发生的事情......您无法直接访问EJB对象,这意味着您没有实际EJB对象的引用(地址)。 当您查找或注入EJB时,容器提供一个对象作为该EJB的客户端(我们可以调用代理或Wrapper),并在该代理对象上调用您的业务方法。 (这就是为什么你不应该使用new关键字来创建EJB类的对象)
现在,对于每种类型的注释,容器生成具有不同方法和功能的不同类型的代理。
@LocalBean
(或无注释)您的代理对象具有:
setOptionalLocalIntfProxy()
getSerializableObjectFactory()
@Local
你的代理对象使用本地调用和com.sun.proxy
类型所以它有:
getSerializableObjectFactory()
isProxyClass()
getProxyClass()
getInvocationHandler()
newProxyInstance()
@Remote
You Wrapper对象使用远程调用,它具有:
readResolve()
writeReplace()
getStub()
getBusinessInterfaceName()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.