Java EJB中的代理对象

Java EJB中的代理对象,java,jakarta-ee,Java,Jakarta Ee,我正在阅读EnterpriseJavaBeans 3.1这本书,我想知道我是否正确理解了EJB代理对象的概念。我现在知道它遵循代理模式,我已经读过一些关于它的文章 当我们为bean创建接口时,我们这样做是因为我们希望实现代理模式。这对我们很有帮助,因为客户机只关心我们能做什么,而不是直接绑定到一个类,而是一个接口,该接口可以充当真实对象所在的位置 因此,容器可能会实例化实现相应接口的代理对象,并在为我们调用真正的EJB之前添加一些魔法代码(网络代码),因为代理对象是自动正确的 我是否误解了这个概

我正在阅读EnterpriseJavaBeans 3.1这本书,我想知道我是否正确理解了EJB代理对象的概念。我现在知道它遵循代理模式,我已经读过一些关于它的文章

当我们为bean创建接口时,我们这样做是因为我们希望实现代理模式。这对我们很有帮助,因为客户机只关心我们能做什么,而不是直接绑定到一个类,而是一个接口,该接口可以充当真实对象所在的位置

因此,容器可能会实例化实现相应接口的代理对象,并在为我们调用真正的EJB之前添加一些魔法代码(网络代码),因为代理对象是自动正确的


我是否误解了这个概念?如果是这样的话,有人能告诉我出了什么问题吗?

正确。如果应用程序仅限于本地JVM,那么为bean编写的接口就足够了。在这种情况下,不需要代理,因为可以直接实例化和提供实现类

EJB的客户机不能在其实现类上工作,因为它们的类路径中没有这些类。EJB是位置透明的,您可以通过网络调用它们,也可以从位于同一服务器上的另一个应用程序调用它们,但这些应用程序由不同的类装入器隔离。在这种情况下,您需要有代理对象来封送、通过网络发送和解组您提供给EJB调用的参数以及您收到的这些调用的结果。在客户端,您需要一个虚拟EJB接口实现,它将您的调用转发给安装了该EJB的服务器

代理还处理其他功能,例如围绕EJB方法调用启动/结束事务


编辑:如果您想知道这些代理究竟能做什么,请看一下Java和AOP(AspectJ或Spring)中RMI的概述。它将让您了解以这种方式可以实现哪些类型的任务。

您是指无状态(和有状态)会话bean和消息驱动bean的代理接口吗

如果是这样,我认为你的理解是正确的。您似乎唯一遗漏的是无状态bean的实例池概念。容器不会为每个请求实例化这些实例,而是在需要时提供一个实现


此外,使用代理允许容器管理的事情发生:事务管理、异步线程管理等。

您已经写到,如果应用程序仅限于本地JVM,则不需要代理。我认为总是需要代理。如何在没有代理的情况下自动实现事务?