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


80

我试图了解EJB的目的以及为什么我们需要不同的客户端视图。有人可以解释吗?

Answers:


126

远程客户端视图

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

本地客户视图

仅在确保其他企业Bean或客户端仅在单个JVM中寻址该Bean时,才可以。例如,EJB以及部署在同一WebSphere服务器上的Servlet。

无界面视图

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

本地客户端视图和无接口视图的区别

在无接口视图的情况下,客户机和目标Bean必须包装在同一应用程序(EAR)中。在本地视图中,客户端可以打包在与企业应用程序不同的应用程序中。因此,在细化组件方面,这提供了更大的灵活性。

您可以使用本地客户端视图还是无接口视图,具体取决于您的API使用情况。无接口视图很有可能在将来的规范中获得灵活的功能。

原因

从历史的角度或其他角度来看,希望使用EJB服务的客户端应该在容器上(具有某些初始上下文)“查找” bean。那是因为所有调用都是通过容器提供的特殊EJB引用(代理)进行的。这允许容器提供所有附加的bean服务,例如池化,容器管理的事务等。因此,客户端无法使用new操作符显式实例化EJB 。客户端视图是通过客户端可以访问的某些接口提供的。服务器端的代理实现是基于这些接口完成的。如上所述,定义了不同的客户端视图以适合不同的部署方案。


5
我想知道是否可以在不同企业应用程序之间使用本地客户端视图。在EJB 3.2规范的3.2.2节中,声明了通过本地客户端视图从不同的应用程序调用bean是特定于供应商的,并且在容器中可能不受支持。您有特定的应用服务器吗?
mcmil 2014年

发生什么事?如果我们“新建”一个EJB(如果客户端和EJB保留在同一应用程序中,则可能会发生)
lovespring 2014年

2
如果使用new,最终会得到一个新实例。就这样。在池化,设置其上下文等方面,该新实例将没有来自容器的任何“支持”。您正在自己运行。
圆环承载者2014年

我在JBoss 7.1.3中刚刚意识到的另一件事是,当我拥有一个实现了既未标记为Local也不标记为Remote的接口的EJB时,我可以在不使用CDI Inject的情况下将EJB作为其接口类型注入CDI bean中。这是对EJB的什么样的看法?有趣的事实是,由于JBoss中的错误,我无法CDI注入任何本地或远程接口类型。
甘道夫2014年

@mcmil同意您的发现。这绝对是特定于供应商的。EJB 3.1规范中提到的相同内容。
Baimai Wu 2014年

3

根据EJB 3.1规范的3.2.2节:

与提供本地客户端视图的企业Bean打包在同一应用程序中的本地客户端,仅要求支持通过本地客户端视图对企业Bean的访问。该规范的兼容实现可以选择支持从打包在不同应用程序中的本地客户端访问企业Bean的本地客户端视图。应用程序间访问本地客户端视图的配置要求是特定于供应商的,并且不在本规范范围内。依赖于对本地客户端视图的应用程序间访问的应用程序是不可移植的。

无接口视图只是一项便利功能,它允许Bean公开本地客户端视图而无需声明单独的接口。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.