78

我了解本地视图、远程视图和无界面视图之间的区别。我只是不明白“无视图”(无注释)和无界面视图有什么区别。还有为什么我应该用 注释我的界面@Local?如果我根本不注释界面怎么办,有什么区别吗?

4

3 回答 3

141

规则是(根据记忆):

  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因为存在诸如无界面视图之类的东西,并且无注释选项作为一种方便的快捷方式而存在。

于 2012-06-05T11:22:45.507 回答
15
  • 远程 EJB:可以从远程客户端访问(运行在不同 JVM 上的客户端,例如在用户机器上运行的 Swing 或 JavaFX 客户端)
  • 本地 EJB:只能从运行在同一 JVM 上的其他“组件”访问,例如 Web 前端、其他 EJB
  • 无接口视图:与本地相同,但不指定业务接口
  • 没有注释:一个简单的 POJO 但不是 EJB

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

于 2012-06-04T23:12:55.700 回答
6

我认为您/我们感到的困惑是历史/向后兼容性(可以这么说)的结果。我无法区分任何区别(除了规范需要实现来创建接口,如果我们使用本地视图)

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

发布 EJB 3.1 之前的 Oracle 博客

于 2012-06-05T10:34:03.273 回答