我了解本地视图,远程视图和无接口视图之间的区别。我只是不了解“无视图”(无注释)和无界面视图之间的区别。以及为什么还要用注释我的界面@Local
?如果我根本不注释接口怎么办,有什么区别吗?
我了解本地视图,远程视图和无接口视图之间的区别。我只是不了解“无视图”(无注释)和无界面视图之间的区别。以及为什么还要用注释我的界面@Local
?如果我根本不注释接口怎么办,有什么区别吗?
Answers:
规则是(从内存中):
@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()
远程公开粗粒度的地方。您可以通过仅使用该方法声明一个远程接口,然后@LocalBean
对bean类打耳光来做到这一点。没有它,您将不得不编写一个无意义的本地接口,只是要在本地公开这两种方法。
或者换一种方式来看,@LocalBean
之所以存在,是因为存在诸如无接口视图之类的东西,并且无注释选项作为方便的快捷方式存在。
@LocalBean
。
本地/无接口视图比远程EJB更有效,因为可以传递对象引用。
我认为您/我们所感到的困惑是历史/可追溯性(可以这么说)的结果。我无法分辨出任何区别(除非规范要求实现(如果我们使用本地视图,则必须创建接口))
无接口视图的行为与EJB 3.0本地视图相同,例如,它支持诸如按引用传递调用语义以及事务和安全性传播之类的功能。但是,无接口视图不需要单独的接口,也就是说,bean类的所有公共方法都会自动向调用者公开。缺省情况下,任何具有空的Implements子句且未定义任何其他本地或远程客户端视图的会话Bean都会公开无接口客户端视图。
如果您对更多技术细节感兴趣,那么我可以说真正发生了什么...。您没有直接访问EJB对象的权限,这意味着您没有实际EJB对象的引用(地址)。当您查找或注入EJB时,容器将提供一个对象作为该EJB的客户端(我们可以称为代理或包装器),并且您可以在该代理对象上调用业务方法。(这就是为什么您不应该使用new关键字来创建EJB类的对象的原因)
现在,对于每种类型的注释,容器都会使用不同的方法和功能生成不同类型的代理。
@LocalBean
(或没有注释)您的代理对象具有:
setOptionalLocalIntfProxy()
getSerializableObjectFactory()
@Local
您代理对象使用本地调用和类型,com.sun.proxy
因此它具有:
getSerializableObjectFactory()
isProxyClass()
getProxyClass()
getInvocationHandler()
newProxyInstance()
@Remote
包装器对象使用远程调用,它具有:
readResolve()
writeReplace()
getStub()
getBusinessInterfaceName()