EJB 3.1 @LocalBean与没有注释

Vac*_*dik 73 java ejb java-ee

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

Tom*_*son 135

规则是(来自记忆):

  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();
}
Run Code Online (Sandbox Code Playgroud)

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

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

  • 确切的规则在EJB 3.1规范的4.9.7节中.它们比您提供的内容稍微复杂一些(homes,webservices,java.io/javax.ejb接口排除),但这是一个很好的总结. (9认同)

Puc*_*uce 15

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

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

  • 当我用Stateless,Statefull或Singleton注释注释它时,我认为POJO变成了EJB.我错过了什么吗? (2认同)

ese*_*sej 6

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

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

在发布EJB 3.1之前的Oracle博客