Java ejb3.1@LocalBean与无注释

Java ejb3.1@LocalBean与无注释,java,jakarta-ee,ejb,Java,Jakarta Ee,Ejb,我理解本地视图、远程视图和无接口视图之间的区别。我只是不明白“无视图”(无注释)和无接口视图之间的区别。还有,为什么我要用@Local注释我的界面?如果我根本不在中注释接口,会有什么不同吗? 远程EJB:可以从远程客户端(在不同JVM上运行的客户端,如在用户机器上运行的Swing或JavaFX客户端)访问 本地EJB:只能从运行在同一JVM上的其他“组件”进行访问,例如Web前端、其他EJB 无接口视图:与本地视图相同,但未指定业务接口 无注释:一个简单的POJO,但不是EJB 本地/无接口视

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

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

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

我认为你/我们感到的困惑是历史/向后兼容(可以这么说)的结果。我看不出有什么不同(除了规范要求实现在使用本地视图时创建接口)

无接口视图与EJB3.0本地视图具有相同的行为, 例如,它支持诸如按引用传递调用之类的功能 语义、事务和安全传播。但是, 无接口视图不需要单独的接口,即所有 bean类的公共方法将自动公开给 呼叫者默认情况下,任何具有空会话的会话bean都会实现 子句,不定义任何其他本地或远程客户端视图, 公开无接口客户端视图

规则是(从内存中):

  • Bean有一个
    @LocalBean
    注释->Bean没有接口视图
  • Bean有一个
    @Local
    注释->Bean有一个本地视图
  • Bean有一个
    @Remote
    注释->Bean有一个远程视图
  • Bean没有视图注释,但直接实现了一个接口,该接口具有@Local注释->Bean具有本地视图
  • Bean没有视图注释,但直接实现了一个接口,该接口具有@Remote annotation->Bean具有远程视图
  • Bean没有视图注释,但直接实现了一个没有视图注释的接口->Bean有一个本地视图
  • Bean没有视图注释,并且实现没有接口->Bean没有接口视图
  • 因此,使用
    @LocalBean
    和根本不使用注释都是获得无接口视图的两种方法。如果您只是想要一个没有接口的视图,那么最简单的事情就是不要注释。前提是您没有实现任何接口

    存在
    @LocalBean
    的部分原因是为了向同样具有接口视图的bean添加无接口视图。我想规范作者最想看到的场景是这样一个bean:

    @Stateless
    public class UserPreferences {
        public String getPreference(String preferenceName);
        public Map<String, String> getPreferences();
    }
    
    @无状态
    公共类用户首选项{
    公共字符串getPreference(字符串首选项名称);
    公共映射getPreferences();
    }
    
    您可能希望在本地公开这两个方法,但仅远程公开粒度较粗的
    getPreferences()
    。您可以通过使用该方法声明一个远程接口,然后在bean类上点击
    @LocalBean
    来实现这一点。如果没有它,您将不得不编写一个毫无意义的本地接口,以便在本地公开这两个方法


    或者,从另一个角度来看,
    @LocalBean
    之所以存在,是因为存在一个无接口视图,而无注释选项是一个方便的快捷方式。

    如果您对更多的技术细节感兴趣,让我说一下到底发生了什么。。。。 您没有直接访问EJB对象的权限,这意味着您没有实际EJB对象的引用(地址)。 当您查找或注入EJB时,容器提供一个对象作为该EJB的客户机(我们可以称之为代理或包装器),您可以在该代理对象上调用业务方法。(这就是为什么不应该使用new关键字来创建EJB类的对象)

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

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

    • setOptionalLocalIntfProxy()
    • getSerializableObjectFactory()
    @Local
    代理对象使用本地调用和
    com.sun.proxy
    类型,因此它具有:

    • getSerializableObjectFactory()
    • isProxyClass()
    • getProxyClass()
    • getInvocationHandler()
    • newProxyInstance()
    @Remote
    包装器对象使用远程调用,它具有:

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

    如果不全部注释,它会变成什么样的EJB bean?或者换言之,容器如何知道类是POJO还是SessionBean?@esej使用无状态、有状态或单例注释对其进行注释,然后使用本地、远程或LocalBean注释对其进行注释,或者不使用此类注释对其进行注释。因此,当您使用无状态、有状态或单例注释对一个类进行注释时,容器就会知道该类是否是SessionBean。(之前我没有看到你认为的区别是什么,现在我变得更聪明了(因为我有一个奇怪的想法)。)我认为没有注释意味着没有接口视图。所以“无视图”和“无界面视图”之间没有区别!我认为当您使用无状态、状态完整或单例注释对POJO进行注释时,POJO就变成了EJB。我遗漏了什么吗?@Puce,你说“没有注释:一个简单的POJO而不是EJB”,这与tomanderson的评论“如果POJ