Java ejb3.1@LocalBean与无注释
我理解本地视图、远程视图和无接口视图之间的区别。我只是不明白“无视图”(无注释)和无接口视图之间的区别。还有,为什么我要用Java ejb3.1@LocalBean与无注释,java,jakarta-ee,ejb,Java,Jakarta Ee,Ejb,我理解本地视图、远程视图和无接口视图之间的区别。我只是不明白“无视图”(无注释)和无接口视图之间的区别。还有,为什么我要用@Local注释我的界面?如果我根本不在中注释接口,会有什么不同吗? 远程EJB:可以从远程客户端(在不同JVM上运行的客户端,如在用户机器上运行的Swing或JavaFX客户端)访问 本地EJB:只能从运行在同一JVM上的其他“组件”进行访问,例如Web前端、其他EJB 无接口视图:与本地视图相同,但未指定业务接口 无注释:一个简单的POJO,但不是EJB 本地/无接口视
@Local
注释我的界面?如果我根本不在中注释接口,会有什么不同吗?- 远程EJB:可以从远程客户端(在不同JVM上运行的客户端,如在用户机器上运行的Swing或JavaFX客户端)访问
- 本地EJB:只能从运行在同一JVM上的其他“组件”进行访问,例如Web前端、其他EJB
- 无接口视图:与本地视图相同,但未指定业务接口
- 无注释:一个简单的POJO,但不是EJB
本地/无接口视图比远程EJB更有效,因为可以传递对象引用 我认为你/我们感到的困惑是历史/向后兼容(可以这么说)的结果。我看不出有什么不同(除了规范要求实现在使用本地视图时创建接口) 无接口视图与EJB3.0本地视图具有相同的行为, 例如,它支持诸如按引用传递调用之类的功能 语义、事务和安全传播。但是, 无接口视图不需要单独的接口,即所有 bean类的公共方法将自动公开给 呼叫者默认情况下,任何具有空会话的会话bean都会实现 子句,不定义任何其他本地或远程客户端视图, 公开无接口客户端视图 规则是(从内存中):
@LocalBean
注释->Bean没有接口视图@Local
注释->Bean有一个本地视图@Remote
注释->Bean有一个远程视图@LocalBean
和根本不使用注释都是获得无接口视图的两种方法。如果您只是想要一个没有接口的视图,那么最简单的事情就是不要注释。前提是您没有实现任何接口
存在@LocalBean
的部分原因是为了向同样具有接口视图的bean添加无接口视图。我想规范作者最想看到的场景是这样一个bean:
@Stateless
public class UserPreferences {
public String getPreference(String preferenceName);
public Map<String, String> getPreferences();
}
@无状态
公共类用户首选项{
公共字符串getPreference(字符串首选项名称);
公共映射getPreferences();
}
您可能希望在本地公开这两个方法,但仅远程公开粒度较粗的getPreferences()
。您可以通过使用该方法声明一个远程接口,然后在bean类上点击@LocalBean
来实现这一点。如果没有它,您将不得不编写一个毫无意义的本地接口,以便在本地公开这两个方法
或者,从另一个角度来看,
@LocalBean
之所以存在,是因为存在一个无接口视图,而无注释选项是一个方便的快捷方式。如果您对更多的技术细节感兴趣,让我说一下到底发生了什么。。。。
您没有直接访问EJB对象的权限,这意味着您没有实际EJB对象的引用(地址)。
当您查找或注入EJB时,容器提供一个对象作为该EJB的客户机(我们可以称之为代理或包装器),您可以在该代理对象上调用业务方法。(这就是为什么不应该使用new关键字来创建EJB类的对象)
现在,对于每种类型的注释,容器都会生成具有不同方法和功能的不同类型的代理
@LocalBean
(或无注释)
您的代理对象具有:
setOptionalLocalIntfProxy()
getSerializableObjectFactory()
@Local
代理对象使用本地调用和com.sun.proxy
类型,因此它具有:
getSerializableObjectFactory()
isProxyClass()
getProxyClass()
getInvocationHandler()
newProxyInstance()
@Remote
包装器对象使用远程调用,它具有:
readResolve()
writeReplace()
getStub()
getBusinessInterfaceName()