EJB 3.1 @LocalBean与没有注释

时间:2012-06-04 23:00:56

标签: java java-ee ejb

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

4 个答案:

答案 0 :(得分:132)

规则是(来自记忆):

  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有一个无界面视图
  8. 因此,使用@LocalBean并且根本不使用注释都是获取无界面视图的方法。如果您只想要一个无界面视图,那么最简单的事情就是不要注释。如果您还没有实现任何接口。

    部分原因@LocalBean存在将无界面视图添加到也具有接口视图的bean。我想在规范作者的头脑中最重要的场景就是你有一个像bean这样的bean:

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

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

    或者,以另一种方式来看,@LocalBean存在,因为存在无界面视图这样的东西,并且no-annotation选项作为方便的快捷方式存在。

答案 1 :(得分:15)

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

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

答案 2 :(得分:6)

我认为您/我们感受到的困惑是历史/向后兼容性的结果(可以这么说)。我无法区分任何差异(除非规范要求实现在我们使用本地视图时创建接口)

  

no-interface视图与EJB 3.0本地视图具有相同的行为,   例如,它支持诸如传递引用调用之类的功能   语义,事务和安全传播。但是,一个   无接口视图不需要单独的接口,即全部   bean类的公共方法会自动暴露给   呼叫者。默认情况下,任何具有空实现的会话Bean   子句并没有定义任何其他本地或远程客户端视图,   公开无界面客户端视图。

Oracle Blog before release of EJB 3.1

答案 3 :(得分:0)

如果您对更多技术细节感兴趣,请告诉我们真正发生的事情...... 您无法直接访问EJB对象,这意味着您没有实际EJB对象的引用(地址)。 当您查找或注入EJB时,容器提供一个对象作为该EJB的客户端(我们可以调用代理或Wrapper),并在该代理对象上调用您的业务方法。 (这就是为什么你不应该使用new关键字来创建EJB类的对象)

现在,对于每种类型的注释,容器会生成具有不同方法和功能的不同类型的代理。

@LocalBean(或没有注释) 您的代理对象有:

  • setOptionalLocalIntfProxy()
  • getSerializableObjectFactory()

@Local 您的代理对象使用本地调用和类型com.sun.proxy所以它具有:

  • getSerializableObjectFactory()
  • isProxyClass()
  • getProxyClass()
  • getInvocationHandler()
  • newProxyInstance()

@Remote You Wrapper对象使用远程调用,它具有:

  • readResolve()
  • writeReplace()
  • getStub()
  • getBusinessInterfaceName()