EJB 3.1 @LocalBean与无注释的区别

80

我了解本地视图、远程视图和无接口视图之间的区别,但我不明白“无视图” (没有注释) 和无接口视图之间的区别。另外,为什么我需要在我的接口上注释 @Local?如果我完全不注释接口,会有什么区别吗?


如果您不对EJB bean进行注释,它会变成什么类型的bean呢?换句话说,容器如何知道一个类是POJO还是SessionBean? - esej
2
你可以使用Stateless、Stateful或Singleton注解来标注它,然后再使用Local、Remote或LocalBean注解进行标注,或者不使用这种类型的注解进行标注。这样容器就能知道当你使用Stateless、Stateful或Singleton注解时,一个类是否是SessionBean。 - VaclavDedik
没错。(之前我没有看出你认为的区别,现在我变聪明了(因为我有一个奇怪的想法)。) - esej
我认为缺少注释意味着没有界面视图。因此,“无视图”和“无界面视图”之间没有区别! - Tom Anderson
3个回答

146

这些规则如下:

  1. Bean带有@LocalBean注解 -> Bean具有无接口视图
  2. Bean带有@Local注解 -> Bean具有本地视图
  3. Bean带有@Remote注解 -> Bean具有远程视图
  4. Bean没有视图注解,但直接实现了一个带有@Local注解的接口 -> Bean具有本地视图
  5. Bean没有视图注解,但直接实现了一个带有@Remote注解的接口 -> Bean具有远程视图
  6. Bean没有视图注解,且未实现任何接口 -> Bean具有无接口视图
  7. Bean没有视图注解,并且也没有实现任何接口 -> Bean具有无接口视图

因此,使用@LocalBean和不加注解都是获得无接口视图的方法。如果您只需要无接口视图,则最简单的方法是不进行任何注解。前提是您也没有实现任何接口。

@LocalBean存在的部分原因是将无接口视图添加到同时具有接口视图的bean中。我想规范作者头脑中最主要的情况是您拥有如下Bean:

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

如果你想在本地公开两种方法,但只想在远程粗略公开getPreferences(),你可以声明一个仅包含该方法的远程接口,然后将@LocalBean附加到bean类上。如果没有它,你需要编写一个无意义的本地接口才能在本地公开这两种方法。

或者,换个角度看,@LocalBean的存在是因为存在无接口视图,而无注解选项存在是方便的快捷方式。


9
准确的规则在EJB 3.1规范的4.9.7节中。它们比你所介绍的稍微复杂一些(包括home、webservice、java.io/javax.ejb接口排除),但这是一个很好的总结。 - Brett Kail
@bkail:感谢提供参考。我手头没有规范的副本,而且当我尝试下载时,Oracle的网站停滞不前,所以我无法检查。不过我已经意识到这是我需要学习的领域! - Tom Anderson
据我了解,POJO 是一个 LocalBean 吗? - bitli
如果POJO没有实现任何接口,并且没有注释,则它具有无接口视图,就像使用@LocalBean进行注释一样。 - Tom Anderson

16
  • 远程EJB:可以从远程客户端访问(在不同JVM上运行的客户端,例如Swing或JavaFX客户端,这些客户端在用户计算机上运行)
  • 本地EJB:只能从在同一JVM上运行的其他“组件”(例如Web前端、其他EJB)中访问
  • 无接口视图:与本地相同,但没有指定业务接口
  • 无注释:简单的POJO而不是EJB

本地/无接口视图比远程EJB更高效,因为对象引用可以传递。


2
我认为当你使用Stateless、Stateful或Singleton注解对POJO进行注解时,它就会变成EJB。我有什么遗漏吗? - VaclavDedik
1
@Puce,你说“没有注释:一个简单的POJO但不是EJB”,这与Tom Anderson的评论“如果POJO没有实现任何接口,并且没有注释,则它具有无接口视图,就像使用@LocalBean注释一样”相矛盾。你能澄清一下吗? - bigfoot

8
我认为你/我们感到困惑的原因是历史/向后兼容性(可以这么说)。我无法分辨出任何区别(除了规范要求实现在使用本地视图时创建接口)。

无接口视图与 EJB 3.0 本地视图具有相同的行为,例如,它支持诸如按引用传递调用语义、事务和安全性传播等功能。但是,无接口视图不需要单独的接口,也就是说,所有 bean 类的公共方法都会自动暴露给调用者。默认情况下,任何具有空实现子句且未定义任何其他本地或远程客户端视图的会话 bean 都会公开一个无接口客户端视图。

EJB 3.1 发布前的 Oracle 博客


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接