我理解本地视图、远程视图和非接口视图之间的区别。我只是不明白“无视图”(无注释)和无接口视图之间的区别。还有,我为什么要用 @Local注释我的接口呢?如果我根本不对接口进行注释,会有什么不同吗?
@Local
本地/无接口视图比远程 EJB 更有效,因为对象引用可以传递。
我认为你/我们感到的困惑是历史/向后兼容性(可以这么说)的结果。我看不出有什么不同(除了规格。如果我们使用 local-view,则需要实现来创建接口)
无接口视图的行为与 EJB 3.0本地视图相同, for example, it supports features such as pass-by-reference calling 语义、事务和安全传播 No-interface 视图不需要单独的接口,即所有 Bean 类的公共方法自动公开给 默认情况下,任何具有空的会话 bean 都实现 子句,并且不定义任何其他本地或远程客户端视图, 公开无接口客户端视图。
Oracle Blog before release of EJB 3.1
规则如下(根据记忆) :
@LocalBean
@Remote
因此,使用 @LocalBean和根本不使用注释都是获得无接口视图的方法。如果您只想要一个无接口视图,那么最简单的事情就是不要注释。前提是您没有实现任何接口。
@LocalBean存在的部分原因是为了向 bean 添加一个无接口视图,而 bean 也有一个接口视图。我想在规范作者的头脑中,最重要的场景是您拥有一个类似于:
@Stateless public class UserPreferences { public String getPreference(String preferenceName); public Map<String, String> getPreferences(); }
您希望在本地公开这两个方法,但是只能远程公开粒度较粗的 getPreferences()。您可以通过仅使用该方法声明一个远程接口,然后在 bean 类上使用 @LocalBean来实现这一点。如果没有它,就必须编写一个毫无意义的本地接口,只是为了在本地公开这两个方法。
getPreferences()
或者,从另一个角度来看,@LocalBean之所以存在,是因为存在一种无接口视图,而无注释选项作为一种方便的快捷方式存在。