我正在阅读Enterprise JavaBeans 3.1一书,我想知道我是否正确理解了EJB代理对象的概念。我现在知道它遵循代理模式,我已经阅读了一些关于它的内容。
当我们为bean创建接口时,我们正在这样做,因为我们希望实现代理模式。这有助于我们,因为客户端只关心我们可以做什么,而不是直接关系到一个类,而是一个可以像真实对象一样的界面。
因此,容器可能实例化实现相应接口的代理对象,并在为我们调用真正的EJB之前添加一些魔术代码(网络代码),因为代理对象是自动生成的?
我误解了这个概念吗?如果是这样,有人会告诉我什么是错的?
答案 0 :(得分:4)
正确。如果您的应用程序仅限于本地JVM,那么您为bean编写的接口就足够了。在这种情况下,不需要代理,因为实现类可以实例化并直接提供。
EJB的客户端无法在其实现类上工作,因为它们在类路径中没有它们。 EJB是位置透明的,您可以通过网络或位于同一服务器上的其他应用程序调用它们,但是由不同的类加载器隔离。在这种情况下,您需要具有编组的代理对象,通过网络发送,以及解组您为EJB调用提供的参数以及您收到的这些调用的结果。在客户端,您需要一个虚拟EJB接口实现,它将您的调用转发到安装此EJB的服务器。
代理还处理其他功能,例如围绕EJB方法调用启动/结束事务。
编辑:如果您对这些代理可以做的事情感到好奇,请查看Java和AOP中的RMI概述(在AspectJ或Spring中)。它将让您了解可以通过这种方式实现哪些任务。
答案 1 :(得分:4)
您是指代无状态(和有状态)会话bean和消息驱动bean的代理接口吗?
如果是这样,我认为你的理解是正确的。您似乎唯一遗漏的是无状态bean的实例池的概念。容器不会根据请求实例化这些,而是在需要时提供实现。
此外,使用代理允许容器管理的事情发生:事务管理,异步线程管理等。