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

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

远程客户端视图

当你的EJB和它的客户端将在一个分布式的环境中 – 这意味着EJB和客户端将驻留在单独的Java虚拟机上。 示例:在WebSphere Application Server上托pipe的EJB和使用托pipe在Tomcat服务器上的EJB API的Servlet。

本地客户端视图

只有当确保其他企业bean或客户端只能在单个JVM中寻址bean时。 例如,EJB以及部署在同一个WebSphere服务器上的Servlet。

无接口视图

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

本地客户端视图和无界面视图的区别

在无接口视图的情况下,客户端和目标bean必须打包在同一个应用程序(EAR)中。 在本地视图的情况下,可以将客户端打包在与企业应用程序不同的应用程序中。 所以,这就为您的组件细化提供了更多的灵活性。

根据您的API使用情况,您可以使用本地客户端视图vs无界面视图。 在未来的规范中,非接口视图很可能会获得灵活的特性。

原因

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

根据EJB 3.1规范的3.2.2节:

通过本地客户端视图访问企业bean只需要为提供本地客户端视图的企业bean打包在同一个应用程序中的本地客户端所支持。 本规范的兼容实现可以select性地支持从封装在不同应用程序中的本地客户端访问企业bean的本地客户端视图。 应用程序间访问本地客户端视图的configuration要求是供应商特定的,不在本规范的范围内。 依赖于对应用程序访问本地客户端视图的应用程序是不可移植的。

无界面视图只是一个方便的function,它允许一个bean公开一个本地的客户端视图,而不必声明一个单独的接口。