EJB 3.1@LocalBean vs 无注释

我理解本地视图、远程视图和非接口视图之间的区别。我只是不明白“无视图”(无注释)和无接口视图之间的区别。还有,我为什么要用 @Local注释我的接口呢?如果我根本不对接口进行注释,会有什么不同吗?

67453 次浏览
  • 远程 EJB: 可以从远程客户端访问(在不同的 JVM 上运行的客户端,如在用户机上运行的 Swing 或 JavaFX 客户端)
  • Local EJBs: can only be access from other "components" running on the same JVM, e.g. Web Front-ends, other EJBs
  • No-interface 视图: 与 Local 相同,但没有指定业务接口
  • 没有注释: 一个简单的 POJO 而不是 EJB

本地/无接口视图比远程 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

规则如下(根据记忆) :

  1. Bean 有一个 @LocalBean注释-> Bean 有一个无接口视图
  2. Bean 有一个 @Local注释-> Bean 有一个本地视图
  3. Bean 有一个 @Remote注释-> Bean 有一个远程视图
  4. Bean 没有视图注释,但是直接实现了一个具有@Local 注释的接口-> Bean 具有一个本地视图
  5. Bean has no view annotations, but directly implements an interface which has a @Remote annotation -> bean has a remote view
  6. Bean has no view annotations, but directly implements an interface which has no view annotations -> bean has a local view
  7. Bean 没有视图注释,并且没有实现接口-> Bean 有一个没有接口的视图

因此,使用 @LocalBean和根本不使用注释都是获得无接口视图的方法。如果您只想要一个无接口视图,那么最简单的事情就是不要注释。前提是您没有实现任何接口。

@LocalBean存在的部分原因是为了向 bean 添加一个无接口视图,而 bean 也有一个接口视图。我想在规范作者的头脑中,最重要的场景是您拥有一个类似于:

@Stateless
public class UserPreferences {
public String getPreference(String preferenceName);
public Map<String, String> getPreferences();
}

您希望在本地公开这两个方法,但是只能远程公开粒度较粗的 getPreferences()。您可以通过仅使用该方法声明一个远程接口,然后在 bean 类上使用 @LocalBean来实现这一点。如果没有它,就必须编写一个毫无意义的本地接口,只是为了在本地公开这两个方法。

或者,从另一个角度来看,@LocalBean之所以存在,是因为存在一种无接口视图,而无注释选项作为一种方便的快捷方式存在。