Java EJB中的本地/远程和无接口视图是什么?

Java EJB中的本地/远程和无接口视图是什么?,java,jakarta-ee,ejb,Java,Jakarta Ee,Ejb,我试图理解EJB的用途以及为什么需要不同的客户机视图。有人能解释一下吗 远程客户端视图 当您的EJB及其客户端位于分布式环境中时,这意味着EJB和客户端将驻留在单独的Java虚拟机上。示例:托管在websphereapplicationserver上的EJB和使用托管在Tomcat服务器上的ejbapi的servlet 本地客户端视图 只有在保证其他企业bean或客户机只在单个JVM中寻址bean时。例如,ejb以及部署在同一WebSphere服务器上的servlet 无界面视图 与本地客户端视

我试图理解EJB的用途以及为什么需要不同的客户机视图。有人能解释一下吗

远程客户端视图

当您的EJB及其客户端位于分布式环境中时,这意味着EJB和客户端将驻留在单独的Java虚拟机上。示例:托管在websphereapplicationserver上的EJB和使用托管在Tomcat服务器上的ejbapi的servlet

本地客户端视图

只有在保证其他企业bean或客户机只在单个JVM中寻址bean时。例如,ejb以及部署在同一WebSphere服务器上的servlet

无界面视图

与本地客户端视图几乎相同,但存在差异。在这种情况下,不需要bean类来实现客户机视图接口。bean类的所有公共方法都会自动向调用方公开。没有接口视图总是通过注入或JNDI查找获取EJB引用,就像本地或远程视图一样;但是,EJB引用的Java类型是bean类类型,而不是本地接口的类型。这是作为JavaEE6的一部分引入的便利性

本地客户端视图和无接口视图之间的差异

如果没有接口视图,客户机和目标bean必须打包在同一个应用程序(EAR)中。在本地视图的情况下,客户机可以打包在企业应用程序之外的单独应用程序中。因此,这在细化组件方面提供了更大的灵活性

根据您的API使用场景,您可以使用本地客户端视图,也可以使用无接口视图。在未来的规范中,无接口视图很可能会收到灵活的功能

原因


历史上或其他情况下,希望使用EJB服务的客户机应该“查找”容器上的bean(使用某些初始上下文)。这是因为所有调用都是通过容器提供的特殊EJB引用(代理)进行的。这允许容器提供所有额外的bean服务,如池、容器管理的事务等。因此,客户机不能使用
new
操作符显式地实例化EJB。客户端视图是通过客户端可以访问的某些接口提供的。服务器端的代理实现是基于这些接口完成的。如上所述,定义了不同的客户端视图以适应不同的部署场景。

根据EJB3.1规范第3.2.2节:

仅允许通过本地客户端视图访问企业bean 需要为打包在同一文件中的本地客户端提供支持 应用程序作为提供本地客户端的企业bean 看法本规范的兼容实现可以是可选的 支持从客户端访问企业bean的本地客户端视图 本地客户端打包在不同的应用程序中。配置 对本地客户端视图的应用程序间访问要求如下 特定于供应商,不在本规范范围内。 依赖于对本地客户端的应用程序间访问的应用程序 视图是不可移植的

无接口视图只是一个方便的特性,它允许bean 公开本地客户端视图,而无需声明单独的 接口


我想知道是否真的可以在不同的企业应用程序之间使用本地客户端视图。在EJB3.2规范第3.2.2节中,指出通过本地客户端视图从不同应用程序调用bean是特定于供应商的,容器中可能不支持。你脑子里有什么特定的应用服务器吗?发生了什么?如果我们“新建”一个EJB(如果客户端和EJB保持在同一个应用程序中,则可能会发生这种情况),如果您使用
new
,则最终会得到一个新实例。这就是全部。这个新实例在池、设置上下文等方面不会得到容器的任何“支持”。您是自己运行的。我刚刚在JBoss 7.1.3中意识到的另一件事是,当我有一个EJB实现一个既不标记为本地也不标记为远程的接口时,我可以将EJB作为其接口类型注入CDIBeans中,不使用CDI注入。这是什么样的EJB视图?有趣的事实是,由于JBoss中的一个bug,我无法使用CDI注入任何本地或远程接口类型。@mcmil同意您的发现。这肯定是特定于供应商的。与EJB3.1规范中提到的相同。