EJB 3.1 @LocalBean vs没有注释

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

规则是(从记忆):

  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() 。 你可以通过用这个方法声明一个远程接口来实现,然后在Bean类上使用@LocalBean 。 没有它,你必须编写一个毫无意义的本地接口,以在本地公开这两种方法。

或者,从另一个angular度来看,存在@LocalBean是因为存在无界面视图这样的事情,并且没有注释选项作为一个方便的快捷方式存在。

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

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

我认为你/我们感到的困惑是历史/向后兼容性的结果(可以这么说)。 我不能区分任何区别(除了规范要求实现创build一个接口,如果我们使用本地视图)

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

Oracle Blog发布之前的EJB 3.1

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

现在,对于每种types的注释,容器都会生成具有不同方法和function的不同types的代理。

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

  • setOptionalLocalIntfProxy()
  • getSerializableObjectFactory()

@Local你的代理对象使用本地调用和com.sun.proxytypes所以它有:

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

@Remote你包装对象使用远程调用,它有:

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