EJB 3.0 和 EJB 3.1 应用程序绑定概述

在启动一个安装在应用程序服务器上的应用程序之前,必须将在该应用程序中定义的所有 Enterprise JavaBeans (EJB) 引用和资源引用都绑定到在该应用程序服务器中定义的实际工件(企业 Bean 或资源)。

从 V8.0 开始,已扩展 EJB 容器中的绑定支持。EJB 容器根据应用程序名称、模块名称和组件名称指定 EJB 3.x 业务接口的缺省 JNDI 绑定。您不必为 EJB 3.x 模块中的每个接口或 EJB Home 接口或者 EJB 3.1 模块中的非接口视图显式定义 JNDI 绑定名称。

定义绑定时,请为应用程序中的可引用工件和已引用工件指定 Java™ 命名和目录接口 (JNDI) 名称。对工件指定的 jndiName 值必须是限定的查询名。

不需要手动为 EJB 3.x 模块中企业 Bean 上的各个接口、EJB Home 接口或非接口视图指定 JNDI 绑定名称。如果未显式地指定绑定,那么 EJB 容器将指定缺省绑定。

缺省 EJB JNDI 绑定的名称空间

应用程序服务器可能会将缺省 EJB 绑定放入传统名称空间和 java:[scope] 名称空间集合。

传统名称空间集合包含 ejblocal: 和 Global JNDI 名称空间。传统名称空间包括 WebSphere® 扩展,在 V8.0 之前,这些名称空间存在于应用程序服务器中。

java:[scope] 名称空间集包含 java:global、java:app 和 java:module 名称空间。java:[scope] 名称空间由 Java EE 6 规范定义,并在 V8 引入到 WebSphere Application Server 中。它们并非用于替换传统名称空间。而是传统名称空间以外的增加项。

传统名称空间详细信息

对于 EJB 3.x 级别,产品根据 EJB 接口是本地接口还是远程接口,为 EJB 接口提供了两个不同的传统名称空间。此配置适用于 EJB Home 接口和非接口视图,这些视图可以视为特殊类型的接口。存在下列传统名称空间:
  • 作用域为 Java 虚拟机 (JVM) 的 ejblocal: 名称空间
  • 全局 JNDI 名称空间

必须将本地 EJB 接口、Home 接口和非接口视图绑定至 JVM 范围的传统 ejblocal: 名称空间;只能从同一应用程序服务器进程中访问这些接口和视图。

相反,远程 EJB 接口和 Home 接口必须始终绑定到全局作用域的 WebSphere JNDI 名称空间;可从任何位置(包括其他服务器进程和其他远程客户机)访问这些接口。本地接口和非接口视图无法绑定至传统全局范围的 JNDI 名称空间,而远程接口无法绑定至 JVM 范围的传统 ejblocal: 名称空间。

传统 ejblocal: 和传统全局范围的 JNDI 名称空间相互独立且截然不同。例如,绑定在“ejblocal:AccountHome”的 EJB 本地接口或非接口视图不同于绑定在传统全局范围名称空间中的“AccountHome”的远程接口。此行为有助于区别本地和远程接口引用。由于具有 JVM 作用域的本地名称空间,因此应用程序也可以直接从 JVM 服务器进程中的任何位置(包括跨 Java Platform, Enterprise Edition (Java EE) 应用程序边界)查询或引用本地 EJB 接口和非接口视图。

EJB 3.x 容器中 EJB 业务接口的缺省传统 JNDI 绑定(基于应用程序名称、模块名称和组件名称)

EJB 容器根据应用程序名称、模块名称和组件名称指定 EJB 3.x 业务接口的缺省传统 JNDI 绑定,因此必须了解这些名称是如何定义的。这些名称均为一个字符串。

Java EE 应用程序以名为企业应用程序归档 (EAR) 文件的标准化格式文件进行封装。EAR 是一种类似于 .zip 或 .tar 文件格式的封装文件格式,因此可形象地认为 EAR 是一组被同时封装在单个物理文件中的逻辑目录和文件。每个 EAR 文件中均含有一个或多个 Java EE 模块文件,这些文件可包含:
  • EJB 模块、Java EE 应用程序客户机模块和实用程序类模块的 Java 应用程序归档 (JAR) 文件
  • Web 模块的 Web 应用程序归档 (WAR) 文件
  • 其他特定于技术的模块(例如资源应用程序归档 (RAR) 文件)以及其他类型的模块
在每个模块文件中通常有一个或多个 Java EE 组件。Java EE 组件可以是企业 Bean、Servlet 和应用程序客户机主类。

因为 Java EE 模块打包在 Java EE 应用程序归档中,而 Java EE 组件又打包在 Java EE 模块中,所以可以使用每个组件的“嵌套路径”并根据组件的应用程序名称、模块名称和组件名称来唯一地标识 Java EE 应用程序归档中的每个组件。

在传统绑定中使用的应用程序名称

应用程序的名称由以下各项(按优先级排序)定义:
  • 将应用程序安装到产品期间,对产品管理控制台指定的应用程序名称的值或者对命令行脚本编制工具 wsadmin 提供的 appname 参数。
  • 应用程序的 META-INF/application.xml 部署描述符中 <display-name> 参数的值。
  • EAR 文件名,不包括 .ear 文件后缀。例如,在这种情况下,名为 CustomerServiceApp.ear 的应用程序 EAR 文件将使用“CustomerServiceApp”作为应用程序名称。
Java EE 6 规范提供常规格式的 EJB JNDI 查询名称:java:global[/appName]/moduleName/beanName。查询名称的 appName 部分显示为可选,原因是它不适用于在独立模块中部署的 bean。只有打包到 .ear 文件中的 bean 才会在 java:global 查询名称中包含 appName 部分。用于确定 appName 的值的规则不同于先前对应用程序名称描述的规则。前面显示的查询名称模板 java:global 中的 appName 值由下列各项(按优先级顺序)定义:
  • 应用程序的 application.xml 部署描述符中 <application-name> 参数的值。
  • EAR 文件名,不包括 .ear 文件后缀。例如,名为 CustomerServiceApp.ear 的应用程序 EAR 文件将使用“CustomerServiceApp”作为应用程序名称。如果此应用程序是独立模块,那么 java:global 查询名称不包含应用程序部分。
按照 Java EE 6 规范,appName 的值也是绑定在名称 java:app/AppName 下的字符串值。

在传统绑定中使用的模块名称

模块的名称定义为模块文件的统一资源标识 (URI),该 URI 相对于 EAR 文件根目录。换句话说,模块名称是模块的相对于 EAR 文件根目录的文件名,该根目录包括任何嵌套了该模块文件的子目录。即使在部署描述符中使用 module-name 元素显式指定了逻辑模块名,此命名约定仍然正确。

在以下示例中,“CustomerServiceApp”应用程序包含三个模块,其名称分别为 AccountProcessing.jarUtility/FinanceUtils.jarAppPresentation.war
CustomerServiceApp.ear:AccountProcessing.jar
com/mycompany/AccountProcessingServiceBean.class AccountProcessingService.class
Utility/FinanceUtils.jar META-INF/ejb-jar.xml
com/mycompany/InterestCalculatorServiceBean.class InterestCalculatorService.class
AppPresentation.war META-INF/web.xml  
Java EE 6 规范提供常规格式的 EJB JNDI 查询名称:java:global[/appName]/moduleName/beanName。查询名称的 appName 部分显示为可选,原因是它不适用于在独立模块中部署的 bean。只有打包到 .ear 文件中的 Bean 才会在 java:global 查询名称中包含 appName 部分。包括此模块名称的另一 JNDI 查询名称变体为 java:app/moduleName/beanNamemoduleName 的值不是模块 URI。java:global 和 java:app 查询名称模板中的 moduleName 值由以下各项定义(按优先级顺序):
  • 模块的 ejb-jar.xmlweb.xml 部署描述符中 <module-name> 参数的值。
  • 模块 URI,不包括其 .jar.war 后缀。例如,URI 为 CustomerService.jarCustomerService.war 的模块的名称为“CustomerService”。
按照 Java EE 6 规范,moduleName 的值也是绑定在名称 java:module/moduleName 下的字符串值。这也适用于客户机模块。对于客户机模块,<module-name> 参数位于 application-client.xml 部署描述符文件中。

在传统绑定中使用的 EJB 组件名称

由以下值(按优先级排序)定义的 EJB 组件的名称:
  • ejb-jar.xml 部署描述符中与 Bean 相关联的 ejb-name 标记(如果存在)的值。
  • 与 Bean 相关联的 @Stateless 或 @Stateful 注释中“name”参数(如果存在)的值。
  • Bean 实现类的名称,不带任何包级别限定符。

EJB 业务接口、Home 接口和非接口视图的缺省传统绑定

您不必为 EJB 3.x 模块中的每个接口或 EJB Home 接口或者 EJB 3.1 模块中的非接口视图显式定义 JNDI 绑定名称。如果您未显式地指定绑定,那么产品的 EJB 容器将使用此处所述的规则来指定缺省传统绑定。这与在支持 EJB 3.0 规范之前该产品中的 EJB 支持不同。

EJB 容器为每个企业 Bean 上的每个接口(业务接口、远程 Home 接口或本地 Home 接口)或非接口视图执行两个缺省传统绑定。这两个传统绑定在此处被称为接口或非接口的“短格式”绑定和“长格式”绑定的视图。短格式绑定只使用接口或非接口视图的包限定 Java 类名,而长格式绑定使用企业 Bean 的组件标识作为包限定接口或非接口视图类名的前附加限定符,并在组件标识与接口或非接口视图类名之间使用编号符号(# 符号)进行分隔。可认为这两种格式之间的差别类似于短格式 TCP/IP 主机名(只有机器名称)与长格式主机名(前面添加了域名的机器名称)之间的差别。

例如,接口或非接口视图的短格式和长格式缺省传统绑定可能分别为 com.mycompany.AccountService 和 AccountApp/module1.jar/ServiceBean#com.mycompany.AccountService。

缺省情况下,EJB 缺省传统绑定的组件标识是使用企业 Bean 的应用程序名称、模块名和组件名称构成,但您可以改为指定您所需要的任何字符串。通过将您自己的字符串定义为组件标识,您可以建立命名约定,其中,企业 Bean 的长格式绑定共用一个公共的用户定义部分,而且还具有一个系统定义的部分(基于每个接口或非接口视图类的名称)。它还允许您使缺省 EJB 绑定名称独立于在应用程序模块层次结构中对企业 Bean 进行打包的方式。在本主题的“EJB 业务接口、Home 接口和非接口视图的用户定义绑定”一节中描述了如何覆盖企业 Bean 的缺省组件标识。

如先前在传统 JVM 作用域本地名称空间和传统全局作用域JNDI 名称空间部分中所提及的那样,所有本地接口、Home 接口和非接口视图都必须绑定至只能从同一服务器进程 (JVM) 访问的传统 ejblocal: 名称空间,而远程接口和 Home 接口都必须绑定至可从 WebSphere 产品单元中的任何位置访问的传统全局作用域名称空间。如您所愿,对于缺省绑定EJB 容器遵循这些规则。

此外,远程接口的长格式缺省绑定还遵循建议的 Java EE 最佳实践,因为它们都归入一个 EJB 上下文名称。缺省情况下,EJB 远程 Home 接口和业务接口都绑定至应用程序服务器命名上下文的根。但是,应用程序服务器根上下文不只是用于绑定 EJB 接口,因此,为了避免此上下文太混乱,最好是将与 EJB 相关的绑定集中到公共“EJB”子上下文,而不是将其直接放在服务器根上下文中。这样做的原因类似于使用磁盘卷上的子目录,而不是将所有文件都放入根目录中。

远程接口的短格式缺省绑定不会绑定至 ejb 上下文。短格式缺省绑定位于服务器根上下文的根目录中。即使最佳实践是将所有与 EJB 相关的绑定分组到 ejb 上下文,但需要考虑其他情况,其中包括下列情况:
  • 短格式缺省绑定提供了简单而直接的方法来访问 EJB 接口。如果将这些绑定直接放在服务器根上下文中,并仅通过接口名称或前面添加了 ejblocal: 的接口名称来引用这些绑定,那么将有助于遵循简洁这一目标。
  • 同时,如果将长格式缺省绑定放入 ejb 上下文或者(如果是本地接口)放入 ejblocal: 上下文,那么这些绑定不会位于服务器根上下文中并减少了混乱,从而足够允许将短格式绑定放入根上下文中。
  • 它提供了与其他使用类似命名约定的 Java EE 应用程序服务器的一定程度的跨兼容性。

总之,所有本地缺省绑定(无论是短格式还是长格式)均被放入经典 ejblocal: server/JVM-scoped namespace;而对于远程缺省绑定而言,如果它们为短格式,那么它们将被放入经典的全局作用域名称空间的服务器的根上下文中,如果它们为长格式,那么它们将被放入 <server_root>/ejb 上下文中(在服务器的根上下文后面)。因此,服务器的全局范围根上下文中的仅有缺省绑定是远程接口的短格式绑定,这可以确保在以下两个方面取得最佳均衡:提供简单的可移植用法模型;避免使服务器的全局范围根上下文变得太混乱。

缺省传统绑定模式

表中显示了各种类型的传统绑定的模式。在这些模式中,用 <bracketed italics> 编写的字符串表示一个值。例如,<package.qualified.interface> 可能是 com.mycompany.AccountService,<component-id> 可能是 AccountApp/module1.jar/ServiceBean。

表 1. 缺省绑定模式. 缺省绑定模式
绑定模式 描述
ejblocal:<package.qualified.interface> 短格式本地接口、Home 接口和非接口视图
<package.qualified.interface> 短格式远程接口和 Home 接口
ejblocal:<component-id>#<package.qualified.interface> 长格式本地接口、Home 接口和非接口视图
ejb/<component-id>#<package.qualified.interface> 长格式远程接口和 Home 接口

component-id 缺省模式为 <application-name>/<module-jar-name>/<ejb-name>,除非如下一部分“多个企业 Bean 实现同一个接口时短格式的缺省绑定名称发生冲突”中所述,在 EJB 模块绑定文件中使用 component-id 属性将其覆盖。如前面的“模块名称”部分中所述,如果 <module-jar-name> 变量未被 EJB 模块绑定文件覆盖,那么该变量是 EAR 中物理模块文件的名称,其中包括扩展名(例如,.jar.ear.war),即使在部署描述符中指定了逻辑模块名称也是如此。

多个企业 Bean 实现同一接口时短格式的缺省传统绑定名称中发生冲突

如果在应用程序服务器中运行的多个企业 Bean 实现给定接口或非接口视图,那么由于短格式缺省传统绑定名称可能表示任何实现此接口或非接口视图的 Enterprise JavaBeans,因此该短名称将变得很含糊。 为了避免这种情况,您必须显式地为实现给定接口或非接口视图的每个 Enterprise JavaBeans 定义一个绑定(如下一部分所述),或者通过定义 WebSphere 产品“JVM 定制属性”com.ibm.websphere.ejbcontainer.disableShortDefaultBindings 来禁用包含这些 Enterprise JavaBeans 的应用程序的短格式缺省传统绑定。 有关定义此 JVM 定制属性的更多信息,请参阅“Java 虚拟机定制属性”。

要使用此 JVM 定制属性,请将属性名称设置为 com.ibm.websphere.ejbcontainer.disableShortFormBinding,并且将属性值设置为 *(星号),表示通配符值以禁用服务器中所有应用程序的短格式缺省传统绑定,或设置为要对其禁用短格式缺省传统绑定的 Java EE 应用程序名称序列,该序列用冒号相分隔,例如,PayablesApp:InventoryApp:AccountServicesApp。

对缺省传统绑定进行显式指定所产生的影响

如果显式地对某一接口、Home 接口或非接口视图指定绑定定义,那么不会对该接口或非接口视图执行任何短格式或长格式缺省传统绑定。
支持的配置 支持的配置: 这仅适用于您对其指定显式绑定的特定接口或非接口视图。该企业 Bean 上其他没有显式指定绑定的接口都将使用缺省传统绑定名称进行绑定。sptcfg

java:[scope] 名称空间

java:global、java:app 和 java:module 名称空间由 Java EE 6 规范引入。它们提供绑定和查询可在应用程序服务器之间移植的资源的机制。

服务器始终会为每个 EJB 接口(包括非接口视图)创建缺省长格式绑定,并将它们放置在 java:global、java:app 和 java:module 名称空间中。还会创建短格式绑定,并将它们放置在 java:global、java:app 和 java:module 名称空间中(如果 Bean 仅公开一个接口,包括非接口视图)。仅会为会话 Bean 创建缺省绑定。不会为实体 Bean 或消息驱动的 Bean 创建缺省绑定。

长格式绑定和短格式绑定都包含应用程序名称、模块名称和 Bean 组件名称。应用程序名称缺省为 .ear 文件的基本名称,不含扩展名。可以使用 application.xml 文件中的 application-name 元素覆盖应用程序名称。模块名称缺省为模块的路径名,除去扩展名,包含所有目录名称。可使用 ejb-jar.xml 或 web.xml 文件中的 module-name 元素覆盖模块名称。Bean 组件名称缺省为 Bean 类的非限定名称。可使用 EJB 组件定义注释上的 name 属性或 ejb-jar.xml 文件中的 ejb-name 元素覆盖 Bean 组件名称。

长格式绑定模式是 java:global/<applicationName>/<moduleName>/<bean component name>!<fully qualified interface name>

短格式绑定模式是 java:global/<applicationName>/<moduleName>/<bean component name>

例如,Bean 组件 MyBeanComponent exposes 仅公开一个 com.foo.MyBeanComponentLocalInterface 接口,并且打包在 myApp.ear 文件的 myModule.jar 模块中。因此,将在 java:[scope] 名称空间中创建以下绑定:
  • java:global/myApp/myModule/MyBeanComponent!com.foo.MyBeanComponentLocalInterface
  • java:global/myApp/myModule/MyBeanComponent
  • java:app/myModule/MyBeanComponent!com.foo.MyBeanComponentLocalInterface
  • java:app/myModule/MyBeanComponent
  • java:module/MyBeanComponent!com.foo.MyBeanComponentLocalInterface
  • java:module/MyBeanComponent
可以使用以下任一种技巧从 java:[scope] 名称空间中获取 MyBeanComponent Bean:
  • 使用 @EJB 注释上的 lookup 属性;例如:
    @EJB(lookup="java:global/myApp/myModule/MyBeanComponent")
  • 使用 ejb-jar.xml 中的 lookup-name 元素;例如:
    <lookup-name>java:global/myApp/myModule/MyBeanComponent!com.ibm.MyBeanComponentLocalInterfaces</lookup-name>
  • 完成在 InitialContext 对象上的 lookup;例如:
    initialContext.lookup("java:global/myApp/myModule/MyBeanComponent!com.foo.MyBeanComponentLocalInterfaces")

除了应用程序服务器创建的缺省绑定之外,还可在 java:global、java:app 和 java:module 名称空间中定义引用。在 java:global、java:app 和 java:module 名称空间中定义的引用不会进入组件名称空间中。在 java:global、java:app 或 java:module 名称空间中定义的引用必须从那些名称空间中查询或插入。不能在组件名称空间中查找或插入这些引用。

Bean 组件可以使用 java:module 名称空间来声明打包在相同模块中的组件可以使用的引用。它可以使用 java:app 名称空间来声明打包在相同应用程序的不同模块中的组件可以使用的引用。它可以使用 java:global 名称空间来声明打包在不同应用程序中的组件可以使用的引用。

java:global、java:app 或 java:module 名称空间中名称完全相同的引用会互相冲突,就如组件名称空间中名称完全相同的引用会冲突一样。范围为某个应用程序的 java:app 名称空间的引用不会与范围为另一应用程序的 java:app 名称空间的名称完全相同的引用冲突。同样,范围为某个模块的 java:module 名称空间的引用,不会与范围为另一模块的 java:module 名称空间的名称完全相同的引用冲突。

可以使用注释在 java:global 名称空间中声明的引用;例如:
@EJB(name="java:global/env/myBean")
可以在 ejb-jar.xml 文件中声明的引用;例如:
<resource-ref>
    <res-ref-name>java:global/env/myDataSource</res-ref-name>
    ....
</resource-ref>         

有关 java:[scope] 名称空间的其他文档,请参阅 Java EE 6 规范的第 5.2.2 节和 Enterprise JavaBeans 3.1 规范的第 4.4 节。

EJB 业务接口、Home 接口和非接口视图的用户定义绑定

如果要手动指定绑定位置,而不是使用产品缺省绑定,那么您可以使用 EJB 模块绑定文件将您自己的绑定位置指定给特定接口、Home 接口和非接口视图。也可以使用此文件仅覆盖模块中一个或多个企业 Bean 上的缺省绑定的组件标识部分。如果覆盖组件标识,那么可以在使用所有缺省绑定与完全指定每个接口或非接口视图的绑定名称之间提供一定的回旋余地。

要为 EJB 3.x 模块指定用户定义的绑定信息,请将 ibm-ejb-jar-bnd.xml 文件放入 EJB Java 归档 (JAR) 文件的 META-INF 目录中。此文件的后缀为 XML。另外,为本地接口或者非接口视图定义传统绑定时,必须在名称的前面添加字符串“ejblocal:”,以便将它绑定到范围仅限于 JVM 的传统 ejblocal: 名称空间。

ibm-ejb-jar-bnd.xml 文件用于在该产品上运行的 EJB 3.0 和更高版本的模块,而 ibm-ejb-jar.bnd.xmi 文件用于版本低于 EJB 3.0 的模块以及 Web 模块。由于下列原因,ibm-ejb-jar.bnd.xml 文件中的绑定文件格式与 XMI 文件格式不同:
  • XMI 文件格式中声明的绑定和扩展取决于是否存在相应的 ejb-jar.xml 部署描述符文件,该文件显式引用连接至该文件中的元素的唯一标识号。对于 EJB 3.0 和更高版本的模块,此系统不再切实可行,在这些版本中,不再要求模块包含 ejb-jar.xml 部署描述符。
  • XMI 文件格式设计为仅用产品开发工具和系统管理功能进行机器编辑;实际上,它原先是产品的内部实现的一部分,并且文件结构从未在外部加以记录。这使得开发者无法手动编辑绑定文件,也无法以受支持的方式在 WebSphere 独立构建过程中创建绑定文件。
  • 基于 XML 的绑定文件不是引用 ejb-jar.xml 部署描述符中已编码的标识号,而是通过 EJB 组件的 EJB 名称来引用该组件。模块中的每个 EJB 组件都具有一个唯一的 EJB 名称,该名称为缺省名称或由开发者显式指定。所以,此行为提供了一种找到目标绑定和扩展的明确方法。
  • 新的绑定文件都基于 XML;并提供了一个 XML 模式定义 (XSD) 文件以便在外部记录该结构。许多常见 XML 文件编辑器都可以使用这些 .xsd 文件,以帮助执行语法验证和代码补全功能。因此,开发者现在可独立于应用程序服务器基础结构生成并编辑绑定和扩展文件。
下表列出了用来将绑定指定给 EJB 3.x 模块的 EJB 接口和 Home 接口以及 EJB 3.1 模块的非接口视图的 ibm-ejb-jar-bnd.xml 元素和属性。
表 2. ibm-ejb-jar-bnd.xml 元素和属性. ibm-ejb-jar-bnd.xml 元素和属性
元素或属性 使用方法 示例 注释
<session> 为会话 Bean 声明一组绑定指定。 <session name="AccountServiceBean"/> 需要 name 属性及下列其中一个或多个属性:simple-binding-name 属性、local-home-binding-name 属性、remote-home-binding-name 属性或 <interface> 元素。
name 该属性标识 <session>、<message-driven>、<entity> 或其他元素所适用于的企业 Bean 的 ejb-name。 <session name="AccountServiceBean"/> name 值是在 ejb-jar.xml 部署描述符文件的 <ejb-name> 元素中声明的名称,或是 @Stateful、@Stateless、@Singleton 或 @MessageDriven 注释的 name 属性,或者缺省为使用 @Session 或 @MessageDriven 注释进行注释的 EJB 实现类的非限定类名(如果在 XML 部署描述符中未声明任何 <ejb-name> 值,并且未在注释上声明任何 name 参数)。
component-id 该属性覆盖企业 Bean 的缺省组件标识值。此企业 Bean 的缺省长格式经典绑定使用指定的组件标识取代 <app_name>/<module_jar_name>/<bean_name>
<session name="AccountServiceBean" 
component-id="Dept549/AccountProcessor"/>

上述示例将生成一个 Bean,它的 ejb-name 是 AccountServiceBean,它的长格式缺省经典本地接口被绑定至以下位置:ejblocal:Department549/AccountProcessor#<package.qualified.interface> 它的长格式缺省经典远程接口被绑定至以下位置:ejblocal:Department549/AccountProcessor#<package.qualified.interface>

可单独使用,或与 <interface> 元素、local-home-binding-name 属性或 remote-home-binding-name 属性一起使用。未对其指定显式绑定的接口可能使用用户指定的组件标识值来执行缺省传统绑定。对其指定了显式绑定的接口将使用那些值进行绑定。

由于打算将 simple-binding-name 属性应用于给定企业 Bean 上的所有已定义接口(任何接口均不使用缺省值),因此将 component-id 与 simple-binding-name 一起应用通常没有用处。

simple-binding-name 一种简单机制,用于指定 Enterprise JavaBeans 的接口绑定以便:
  • 实现单个 EJB 3.x 业务接口
  • 使用姊妹 EJB Home 接口来实现低于 EJB 3.0 类型的组件接口(本地和/或远程类型)。
该属性的值用作企业 Bean 业务接口的绑定位置或 Enterprise JavaBeans 本地 Home 接口和/或远程 Home 接口的绑定位置。绑定被放入传统 ejblocal: 名称空间中(如果接口或 Home 接口为本地),或者被放入传统全局范围的 JNDI 名称空间的应用程序服务器根上下文中(如果接口或 Home 接口为远程)。
<session name="AccountServiceBean"
simple-binding-name="ejb/AccountService"/>
此示例将生成一个 Bean,它的 ejb-name 是 AccountServiceBean,它的本地业务接口或 Home 接口(如果有)被绑定至传统本地 JVM 范围的 EJB 名称空间中的 ejblocal:ejb/AccountService,其远程业务接口或 Home 接口(如果有)被绑定至传统全局范围 JNDI 名称空间的应用程序服务器根上下文中的 ejb/AccountService。
要点: 重要事项:
使用了该属性(在此特定示例中,包括“ejb”子上下文名称)的准确值,即使接口是绑定到 ejblocal: 名称空间的本地接口亦如此。如果指定了用户定义的绑定,那么将使用该属性指定的准确名称。
不要将其与 local-home-binding-name 属性、remote-home-binding-name 属性或 <interface> 元素一起使用。另外,也不能在实现多个业务接口的 Bean 上使用 - 在这种情况下,请改用 <interface> 元素。

如果在实现多个业务接口的企业 Bean 上使用此属性,或者将业务接口和本地/远程组件接口与 Home 接口一起使用,那么可通过如下方法来确保生成的绑定没有歧义:在属性值后面添加破折号或编号符号(# 符号),紧随其后是企业 Bean 上每个接口和/或 Home 接口的包限定类名。然而,可使用 <interface> 元素为每个业务接口定义绑定而不是使用 simple-binding-name 来避免这种情况。

要点: 重要事项:
在实现多个业务接口的 Bean 上定义 simple-binding-name 与使用 <component-id> 覆盖 Bean 的缺省组件标识并不相同。使用 component-id 定义的远程接口缺省绑定仍分组到 EJB 上下文(所有远程接口缺省绑定都进行这样的分组),而远程接口绑定(这些绑定使用 EJB 容器来消除歧义,以便对在具有多个接口的 Bean 上错误使用 simple-binding-name 的情况作出反应)并不被分组到 ejb 上下文。
另外,对于长格式缺省传统绑定,始终包含包限定类名,而对于 simple-binding-name,仅在发生错误时为消除歧义的情况下才包含包限定类名。请不要依赖于通过消除歧义创建的绑定名称,因为在更改 Bean 以实现更多或更少接口时,可能不会产生这样的效果。
local-home-binding-name 用于指定企业 Bean 的本地 Home 接口绑定位置的属性。
<session name="AccountServiceBean"
 local-home-binding-name="ejblocal:AccountService"/>
不要将其与 simple-binding-name 属性一起使用。由于本地 Home 接口必须始终绑定至传统 JVM 范围的名称空间,因此该值必须以 ejblocal: 前缀开头。
remote-home-binding-name 用于指定企业 Bean 的远程 Home 接口绑定位置的属性。
<session name="AccountServiceBean"
 remote-home-binding-name=
 "ejb/services/AccountService"/>
不要将其与 simple-binding-name 属性一起使用。由于远程 Home 接口无法绑定至传统 ejblocal: 名称空间,因此该值不能以传统 ejblocal: 前缀开头。
<interface> <session> 元素的子元素,用于将绑定指定给特定 EJB 业务接口或非接口视图。与 simple-binding-name、local-home-binding-name 和 remote-home-binding-name 属性不同的是,binding-name 参数和类参数都是必需的(事实上,这种差别可解释需要单独的 XML 元素而不是某一属性的原因)。该类参数指定要绑定的业务接口或非接口视图类的包限定名称。
<interface class="com.ejbs.InventoryService" 
binding-name="ejb/Inventory"/> 
(声明为 <session> 元素中的一个子元素)
不要将其与 simple-binding-name 属性一起使用。由于本地接口和非接口视图必须始终绑定至传统 JVM 范围的名称空间,因此将此元素应用于本地接口或非接口视图时,binding-name 值必须以 ejblocal: 前缀开头。
binding-name 该属性用以指定使用 <interface> 元素进行绑定的业务接口的绑定位置。
<interface class="com.ejbs.InventoryService" 
binding-name="ejb/Inventory"/>
(声明为 <session> 元素中的一个子元素)
必须与 <interface> 元素一起使用且仅在该元素上使用。由于本地接口必须始终绑定至传统 JVM 范围的名称空间,因此在被应用于本地接口时,binding-name 值必须以 ejblocal: 前缀开头。

绑定文件示例 1

以下示例是一个基本的 ibm-ejb-jar-bnd.xml 文件,它仅包含将绑定名称指定给 EJB 接口和非接口视图的元素和属性。它将覆盖用于名为 S01 的企业 Bean 上的缺省绑定的组件标识,并对此模块中企业 Bean S02S03 上的某些接口指定显式绑定。
<?xml version="1.0" encoding="UTF-8?"> 
<ejb-jar-bnd xmlns=http://websphere.ibm.com/xml/ns/javaee xmlns:xsi="
 http://www.w3.org/2001/XMLSchema-instance "xsi:schemaLocation"=
 http://websphere.ibm.com/xml/ns/javaee 
 http://websphere.ibm.com/xml/ns/javaee/ibm-ejb-jar-bnd_1_0.xsd "version 1.0">
 <session name="S01" component-id="Department549/AccountProcessors"/>
 <session name="S02" simple-binding-name="ejb/session/S02"/> 
 <session name="S03"> 
  <interface class="com.ejbs.BankAccountService" binding-name="ejblocal:session/BAS"/>
 </session>  
</ejb-jar-bnd>
该绑定文件具有以下结果:
  • 对 ejb-name 为 S01 的会话 Bean 指定了用户定义的组件标识,此组件标识将覆盖该 Bean 上所有接口视图和非接口视图的缺省组件标识(应用程序名称/ejb-jar 模块名称/Bean 名称)。此 Bean 上的本地接口视图和非接口视图被绑定至 ejblocal:Department549/AccountProcessors#<package.qualified.interface.name>,而远程接口则绑定至 ejb/Department549/AccountProcessors#<package.qualified.interface.name>
  • 假定 ejb-name 为 S02 的会话 Bean 具有单个 EJB 3.x 业务接口或 EJB 3.1 非接口视图。此外,它可能还具有一个带有本地 Home 接口和/或远程 Home 接口且版本低于 EJB 3.0 的“组件”接口。如果业务接口或组件接口的一个或多个 Home 接口是本地接口,那么将绑定至 ejblocal:ejb/session/S02,如果是远程接口,那么将绑定至 ejb/session/S02。

    如果 bean S02 具有多个业务接口或多个业务接口和 Home 接口,那么 simple-binding-name 就有歧义。在该情况下,容器通过在每个 Bean 接口的简单绑定名称 ejb/session/S02 后面附加 #<package.qualified.interface.name> 来消除绑定指定的歧义。

  • ejb-name 为 S03 的会话 Bean 上的 EJB 3.x 业务接口或 EJB 3.1 非接口视图 com.ejbs.BankAccountService 被绑定至 ejblocal:session/BAS。
如果此 Bean 上存在其他业务接口、Home 接口和非接口视图,那么将对所有这些接口和视图指定缺省传统绑定。在本示例中,由于为 ejblocal: 名称空间指定了 com.ejbs.BankAccountService 接口,因此假定该接口为本地接口;如果该接口不是本地接口,那么将发生错误。

下一部分将扩展此示例,引入一些元素,用于解析在 XML 部署描述符中或通过注释来声明的各种引用和注入条目的目标。

用于对引用和注入目标进行解析的用户定义绑定

前一部分显示了一些对业务接口、Home 接口和非接口视图指定用户定义的绑定名称的示例。此部分包括如何解析引用、注入伪指令和消息驱动的 Bean 目标的链接目标。

表 3. 用于解析引用和注入目标的链接目标的元素和属性. 用于解析引用和注入目标的链接目标的元素和属性
元素或属性 使用方法 示例 注释
<jca-adapter> 定义 JCA 1.5 适配器激活规范和消息目标 JNDI 位置,用于将消息传递至消息驱动的 Bean。
<jca-adapter 
activation-spec-binding-name="jms/InternalProviderSpec"
destination-binding-name="jms/ServiceQueue"/>
需要 activation-spec-binding-name 属性。如果相应的消息驱动的 Bean 通过使用 <message-destination-link> 元素无法识别其消息目标,那么还需要 destination-binding-name 属性。可根据情况包括 activation-spec-auth-alias 属性。
<ejb-ref> 解析 ejb-ref 声明的目标,该目标是通过 @EJB 注释或通过 ejb-jar.xml 部署描述符中的 ejb-ref 进行声明,在组件范围的 java:comp/env 名称空间中声明的名称与传统 JVM 范围的 ejblocal: 或传统全局范围的 JNDI 名称空间中的目标企业 Bean 的名称之间提供链接。
<ejb-ref name="com.ejbs.BankAccountServiceBean/s02Ref" 
binding-name="ejb/session/S02"/>
需要 name 和 binding-name 属性。
<message-driven> 为消息驱动的 Bean 声明一组绑定指定。
<message-driven name="EventRecorderBean">
<jca-adapter 
activation-spec-binding-name="jms/InternalProviderSpec" 
destination-binding-name="jms/ServiceQueue"/>
</message-driven>
需要 name 属性和 <jca-adapter> 子元素。
<message-destination> 将消息目标的名称(在 Java EE 模块部署描述符中定义的逻辑名称)与特定的全局 JNDI 名称(JNDI 名称空间中的实际名称)相关联。Java EE 模块部署描述符中的 <message-destination-ref> 元素或用于注入消息目标的 @Resource 注入伪指令随后可使用 <message-destination-line> 元素按目标逻辑名称来引用此 message-destination,而不需要绑定文件中每个已定义 message-destination-ref 的各个 <message-destination-ref> 绑定条目。
<message-destination name="EventProcessingDestination"
binding-name="jms/ServiceQueue"/>
需要 name 和 binding-name 属性。
<message-destination-ref> 解析 message-destination-ref 声明的目标,该目标是通过 @Resource 注释或通过 ejb-jar.xml 中的 message-destination-ref 进行声明,在组件范围的 java:comp/env 名称空间中声明的名称与全局 JNDI 名称空间中目标资源环境的名称之间提供链接。
<message-destination-ref
name="com.ejbs.BankAccountServiceBean/serviceQueue"
binding-name="jms/ServiceQueue"/>
需要 name 和 binding-name 属性。
<resource-ref> 解析 resource-ref 声明的目标,该目标是通过 @Resource 注释或通过 ejb-jar.xml 中的 resource-ref 进行声明,在组件范围的 java:comp/env 名称空间中声明的名称与全局 JNDI 名称空间中目标资源的名称之间提供链接。
<resource-ref 
name="com.ejbs.BankAccountServiceBean/dataSource" 
binding-name="jdbc/Default"/>
需要 name 和 binding-name 属性。可包括 authentication-alias 或 custom-login-configuration 属性。
<resource-env-ref> 解析 resource-env-ref 声明的目标,该目标是通过 @Resource 注释或通过 ejb-jar.xml 中的 resource-env-ref 进行声明,在组件范围的 java:comp/env 名称空间中声明的名称与全局 JNDI 名称空间中目标资源环境的名称之间提供链接。
<resource-env-ref 
name="com.ejbs.BankAccountServiceBean/dataFactory"
binding-name="jdbc/Default"/>
需要 name 和 binding-name 属性。
<env-entry> 使用以字符串格式表示的指定值或对象来覆盖环境条目,可对应用于缺省初始上下文的指定查询名称执行 JNDI 查询来访问此对象。
<env-entry name="java:module/env/taxYear" value="2010"/>
<env-entry name="java:module/env/taxYear" 
binding-name="cell/persistent/MyApp/MyModule/taxYear"/
需要 name 属性以及该值或 binding-name 属性,但不需要同时使用两者。
<data-source> 使用受管资源来覆盖通过 @DataSourceDefinition 注释或应用程序中的数据源元素声明的数据源定义或模块部署描述符。
<data-source name="java:module/env/myDS" 
binding-name="jdbc/DB2DS"/>
需要 name 和 binding-name 属性。
name 该属性标识命名位置,该位置通常位于特定于组件的 java:comp/env 名称空间中,用于在诸如 ejb-ref、resource-ref、resource-env-ref、message-destination 或 message-destination-ref 中定义引用/目标链接的“源”端。
<ejb-ref name="com.ejbs.BankAccountServiceBean/goodBye"
binding-name="ejb/session/S02"/>
 
binding-name 该属性标识命名位置,该位置位于传统 ejblocal: 或传统全局范围的 JNDI 名称空间或者 java:global 名称空间中,用于定义诸如 ejb-ref、resource-ref、resource-env-ref、message-destination 或 message-destination-ref 中的引用/目标链接的“目标”端。
<ejb-ref name="com.ejbs.BankAccountServiceBean/goodBye"
binding-name="ejb/session/S02"/>
 
用于指定要用于 env-entry 绑定的值的属性。
<env-entry name="java:module/env/taxYear" value="2010"/>
 
activation-spec-binding-name 该属性标识与 JCA 1.5 适配器相关联的激活规范的 JNDI 位置,此适配器用于将消息传递至消息驱动的 Bean。
<jca-adapter 
activation-spec-binding-name="jms/InternalProviderSpec"
destination-binding-name="jms/ServiceQueue"/>
此名称必须与定义到 WebSphere Application Server 的 JCA 1.5 激活规范的名称相匹配。
activation-spec-auth-alias 该可选属性标识某一名称,该名称是用于认证到 JCA 资源适配器的连接的 J2C 认证别名名称。J2C 认证别名指定了用于认证创建到 JCA 资源适配器的新连接的用户标识和密码。
<jca-adapter 
activation-spec-binding-name="jms/InternalProviderSpec"
activation-spec-auth-alias="jms/Service47Alias"
destination-binding-name="jms/ServiceQueue"/>
此名称必须与定义到 WebSphere Application Server 的 J2C 授权别名的名称相匹配。
destination-binding-name 该属性标识 JNDI 名称,消息驱动的 Bean 使用此名称在 JNDI 名称空间中查询它的 JMS 目标。
<jca-adapter 
activation-spec-binding-name="jms/InternalProviderSpec"
destination-binding-name="jms/ServiceQueue"/>
此名称必须与定义到 WebSphere Application Server 的 JMS 队列或主题的名称相匹配。
authentication -alias <resource-ref> 绑定元素的可选子元素。如果资源引用适用于连接工厂,那么可以指定可选的 JAAS 登录配置;在这种情况下,指的是简单认证别名。
<resource-ref
name="com.ejbs.BankAccountServiceBean/dataSource"
binding-name="jdbc/Default">
<authentication-alias name="defaultAuth"/>
<resource-ref>
此名称必须与定义到 WebSphere Application Server 的 JAAS 认证别名的名称相匹配。
custom-login-configuration <resource-ref> 绑定元素的可选子元素。如果资源引用适用于连接工厂,那么可以指定可选的 JAAS 登录配置;在这种情况下,指的是一组属性(“名称/值”对)。
<resource-ref 
name="com.ejbs.BankAccountServiceBean/dataSource"
binding-name="jdbc/Default">
<custom-login-configuration-name="customLogin">
<property name="loginParm1" value="ABC123"/>
<property name="loginParm2" value="DEF456"/>
</custom-login-configuration> 
</resource-ref>
此名称必须与定义到 WebSphere Application Server 的 JAAS 登录配置的名称相匹配。

绑定文件示例 2

以下示例是示例 1 中引入的基本 ibm-ejb-jar-bnd.xml 文件的扩展。
<?xml version="1.0" encoding="UTF-8"?> 
<ejb-jar-bnd xmlns="http://websphere.ibm.com/xml/ns/javaee" "xmlns:xsi"=
"http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://websphere.ibm.com/xml/ns/javaee" 
"http://websphere.ibm.com/xml/ns/javaee/ibm-ejb-jar-bnd_1_0.xsd version" "1.0">
 <session name="S01" component-id="Department549/AccountProcessors"/>
 <session name="S02" simple-binding-name="ejb/session/S02"/>
 <session name="S03">
  <interface class="com.ejbs.BankAccountService"
   binding-name="ejblocal:session/BAS"/>
  <ejb-ref name="com.ejbs.BankAccountServiceBean/goodBye"
   binding-name="ejb/session/S02"/>
  <resource-ref name="com.ejbs.BankAccountServiceBean/dataSource"
   binding-name="jdbc/Default"/>
 </session>
 <message-driven name="MO1">
  <jca-adapter activation-spec-binding-name="jms/InternalProviderSpec"
   destination-binding-name=jms/"ServiceQueue"/>
 </message-driven>
 <session name="S04" simple-binding-name="ejb/session/S04">
  <resource-ref name="ejbs.S04Bean/dataSource"
   binding-name="jdbc/Default">
   <authentication-alias name="defaultlogin"/>
  </resource-ref>
 </session>
 <session name="S05">
  <interface class="com.ejbs.InventoryService"
   binding-name="ejb/session/S05Inventory"/>
  <resource-ref name="ejbs.S05Bean/dataSource"
   binding-name="jdbc/Default">
   <custom-login-configuration name="customLogin">
    <property name="loginParm1" value="ABC123"/>
    <property name="loginParm2" value="DEF456"/>
   </custom-login-configuration>
  </resource-ref>
 </session>
</ejb-jar-bnd>
此绑定具有以下结果:
  1. 名为 S01、S02 和 S03 的会话 Bean 的业务接口、Home 接口和非接口视图绑定与上一示例相同。
  2. 其 ejb-name 为 S03 的会话 Bean 现在包含两个引用目标解析绑定:
    • ejb-ref 绑定将在 java:comp/env/com.ejbs.BankAccountServiceBean/goodBye 处定义的 EJB 引用解析为应用程序服务器根 JNDI 上下文中的 JNDI 位置 ejb/session/S02。还可由 com.ejbs.BankAccountServiceBean 类中对名为“goodBye”的实例变量执行的 @EJB 注入来定义 EJB 引用。
      注: ejb/session/S02 是会话 Bean S02 的 JNDI 位置(也已经在此绑定文件中定义),这意味着此引用指向名为 S02 的会话 Bean。
    • resource-ref 绑定将在 java:comp/env/com.ejbs.BankAccountServiceBean/dataSource 处定义的资源引用解析为 JNDI 位置 jdbc/Default。该资源引用也可能已由 com.ejbs.BankAccountServiceBean 类中对名为“dataSource”的实例变量执行的 @Resource 注入进行定义。
  3. 绑定是对其 ejb-name 为 M01 的消息驱动的 Bean 定义的。MDB 使用 JCA 1.5 适配器(其 JCA 1.5 激活规范已定义到 WebSphere Application Server,名为 jms/InternalProviderSpec)接收来自定义到 WebSphere Application Server 的 JMS 目标的消息,该 JMS 目标的 JNDI 名称为 jms/ServiceQueue。
  4. 假定 ejb-name 为 S04 的会话 Bean 具有单个业务接口或非接口视图,如果它是远程接口或视图,那么将绑定至 ejb/session/S04,如果它是本地接口或视图,那么将绑定至 ejblocal:ejb/session/S04。它具有名为 java:comp/env/ejbs/S04Bean/dataSource 的 resource-ref。这也可以是类 ejbs.S04Bean,带有到名为 dataSource 的变量的 @Resource 注入。 此资源引用将解析为 JNDI 位置 jdbc/Default。resource-ref 引用 J2C 连接并使用 WebSphere Application Server 中已定义的名为 defaultlogin 的简单认证别名连接至此资源。
  5. 业务接口绑定是对其类名为 com.ejbs.InventoryService(由其 ejb-name 为 S05 的会话 Bean 实现)的接口定义的;假定该接口为远程接口(因为它未添加“ejblocal:”作为前缀),因此可能绑定至传统全局范围名称空间的服务器的根 JNDI 上下文中的 ejb/session/S05Inventory。将对由此 Bean 实现的任何其他业务接口指定缺省传统绑定。此 Bean 具有一个名为 java:comp/env/ejbs.S05Bean/dataSource(或者 ejbs.S05Bean 类中对名为“dataSource”的变量执行的 @Resource 注入)的 resource-ref,解析为 JNDI 位置 jdbc/Default。resource-ref 引用 J2C 连接并且使用包含两个“名称/值”对的定制登录配置连接至此资源。

绑定文件示例 3

位于本节稍后部分的此示例说明如何定义和解析 EJB 引用绑定,以在同一个 WebSphere Application Server 单元中跨应用程序服务器实例执行 JNDI 查询。它使用两个 EJB bean:一个被调用 bean 和一个调用 bean。被调用 bean 使用 simple-binding-name 属性来定义显式绑定属性,而调用 bean 执行 @EJB 注入并使用它的关联绑定文件中的 ejb-ref 元素来解析引用,以便它指向位于不同应用程序服务器进程中的被调用 bean。

ibm-ejb-jar-bnd.xml (called bean)

<?xml version="1.0" encoding="UTF-8"?> 
<ejb-jar-bnd xmlns="http://websphere.ibm.com/xml/ns/javaee" 
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
 xsi:schemaLocation="http://websphere.ibm.com/xml/ns/javaee" 
 "http://websphere.ibm.com/xml/ns/javaee/ibm-ejb-jar-bnd_1_0.xsd" version="1.0"> 
 <session name="FacadeBean" simple-binding-name="ejb/session/FacadeBean"/> 
</ejb-jar-bnd>
此绑定文件内容假定其 ejb-name 为“FacadeBean”的会话 Bean 将实现单个业务接口,因此可使用 simple-binding-name 属性来 <interface> 替代子元素。在这种情况下,FacadeBean 将实现单个远程业务接口,该接口被绑定至应用程序服务器的服务器根 JNDI 上下文(FacadeBean 所在的位置)中的 ejb/session/FacadeBean。

代码段(调用 Bean)

@EJB(name="ejb/FacadeRemoteRef") 	
FacadeRemote remoteRef; 	
try {
     output = remoteRef.orderStatus(input);
} 
catch (Exception e) {
     // Handle exception, etc.
} 
此代码段对名为“remoteRef”、类型为 FacadeRemote 的实例变量执行 EJB 资源注入。此注入将覆盖“name”参数,将最终获得的 ejb-ref 引用名称设置为 ejb/FacadeRemoteRef。此代码将对所注入的引用调用业务方法。

ibm-ejb-jar-bnd.xml(调用 Bean)

<?xml version="1.0" encoding="UTF-8"?> 
<ejb-jar-bnd xmlns="http://websphere.ibm.com/xml/ns/javaee" 
 "xmlns:xsi="
 "http://www.w3.org/2001/XMLSchema-instance" 
 xsi:schemaLocation="http://websphere.ibm.com/xml/ns/javaee" 
 "http://websphere.ibm.com/xml/ns/javaee/ibm-ejb-jar-bnd_1_0.xsd" version="1.0">
 <session name="CallingBean">     
  <ejb-ref name="ejb/FacadeRemoteRef" 
   binding-name="cell/nodes/S35NLA1/servers/S35serverA1/ejb/session/FacadeBean"/>   
 </session> 
</ejb-bnd-jar>  
最后,此绑定文件将 ejb-ref 名为 ejb/FacadeRemoteRef 的 EJB 引用解析为指向 cell/nodes/S35NLA1/servers/S35serverA1/ejb/session/FacadeBean 的传统全局范围 JNDI 名称。此全局范围的传统 JNDI 名称表示一个接口,该接口绑定至名为“S35serverA1”的服务器(位于调用 Bean 的 WebSphere Application Server 单元中名为“S35NLA1”的节点上)的服务器根上下文处的 ejb/session/FacadeBean。为了指向其他 WebSphere Application Server 单元中的位置,可使用 CORBAName 样式的名称取代标准的 JNDI 名称。

可以在“用于更新应用程序文件的方法”主题中找到有关如何修改 ibm-ejb-jar-bnd.xml 文件的指示信息。

注入和引用之间的关系

在注入伪指令与引用声明之间存在一对一联系:每个注入均隐式地定义某一类型的引用,相反,每个引用均可以根据情况定义一个注入。可将注入注释视为一种通过注释定义引用而不是在 XML 部署描述符中定义引用的机制。

缺省情况下,注入使用某一名称来定义引用,该名称由执行注入的组件的包限定类名、正斜杠 (/) 以及要在其中注入的变量或属性的名称构成。例如,在 com.ejbs.AccountService 类中对名为“depositService”的变量或属性执行的注入将产生名为 java:comp/env/com.ejbs.AccountService/depositService 的引用。但是,对注入伪指令指定可选的“name”参数会覆盖此缺省名称,并导致根据“name”参数的值对此引用命名。

如果知道此规则,那么就很容易弄清楚如何做到:使用绑定文件不但解析在 XML 部署描述符中声明的引用的目标,而且解析由注释注入伪指令隐式声明的引用的目标。只需使用注入注释的“name”参数的值,或者使用类名和变量名/属性名称的缺省引用名称(如果未指定“name”参数),就像它是在 XML 部署描述符中声明的引用名称一样。

EJB 引用和 EJB 注入的缺省解析:EJB 链接和自动链接功能

EJB 链接自动链接功能是两种不同的机制,用于解析对 EJB 组件的引用,这些组件打包在引用组件所在的应用程序和应用程序服务器进程中。EJB 链接和自动链接都不需要显式解析具有绑定信息的 EJB 引用。EJB 链接功能将通过 EJB 规范进行定义,而自动链接功能则是 WebSphere Application Server 的扩展功能。

EJB 链接和自动链接功能使用不同的搜索条件来查找目标 Bean 组件。EJB 链接使用显式指定的 Bean 名称来搜索目标 Bean 组件。自动链接使用 Bean 实现的接口来搜索目标 Bean 组件。如果未提供显式绑定但提供了 Bean 名称,那么将使用 EJB 链接功能。如果未提供显式绑定并且未提供 Bean 名称,那么将使用自动链接功能。永远不会在同一搜索进程中将 EJB 链接和自动链接功能一起使用。

除搜索条件以外,EJB 链接和自动链接功能是相似的。这两个功能都会首先搜索特定模块,然后,如果有需要,将后退到搜索同一应用程序和应用程序服务器进程中的其他模块。这两个功能都要求搜索条件精确地解析为一个 Bean 组件,当搜索条件解析为多个 Bean 组件时,将认为这是一个错误情况。出现错误情况是因为应用程序服务器不知道必须使用多个 Bean 组件中的哪个组件。在此情况下,将发生 com.ibm.websphere.ejbcontainer.AmbiguousEJBReferenceException 异常。当引用组件尝试查找目标 Bean 组件时,在运行时会抛出此异常。

EJB 链接功能支持三种不同的格式。
  • 仅指定 Bean 组件的名称。例如,MyBean。
  • 指定包含目标 Bean 组件的物理模块文件的名称(包括扩展名),后面跟有 # 字符,然后是 Bean 组件的名称。例如,myModule.jar#MyBean
  • 指定包含目标 Bean 组件的模块的逻辑名称,后面跟有斜杠字符 (/),然后是 Bean 组件的名称。例如,MyModule/MyBean。

(可选)可以在 ejb-jar 模块的 EJB 部署描述符中使用 module-name 元素,或者可以在包含 EJB 内容的 WAR 模块的 Web 部署描述符文件中使用 module-name 元素,指定模块的逻辑名。对于包含 EJB 内容的 WAR 模块,将忽略 EJB 部署描述符中指定的 module-name 元素,并且处理 Web 部署描述符中指定的 module-name 元素。未在部署描述符中指定 module-name 值时,将对模块指定缺省逻辑名。缺省逻辑模块名是模块文件的基本名称,没有扩展名。例如,模块文件 MyModule.jar 具有缺省逻辑模块名称 MyModule。

即使在模块具有逻辑名时,也仍然支持指定物理模块文件的名称。即使在部署描述符中未配置逻辑模块名时,也仍然支持指定模块的逻辑名。在这种情况下,模块的基本名称将用作模块的逻辑名。

可嵌入 EJB 容器支持所有 EJBLink 格式。为了支持物理模块文件格式,可嵌入 EJB 容器不允许您启动具有相同基本名称的多个模块。

自动链接是 WebSphere Application Server 的增值功能,以便在某些使用方案中不需要显式地解析 EJB 引用目标。在 WebSphere Application Server V8 中,在每个 WebSphere Application Server 进程的边界内实现了自动链接。自动链接算法的工作原理如下。

当产品中的 EJB 容器在给定的 EJB 模块中遇到 EJB 引用时,它首先检查您是否已通过在模块的绑定文件中包含某一条目来显式地解析该引用的目标。如果在绑定文件中找不到目标的任何显式解析,那么该容器将在引用模块中搜索用于实现您在引用中定义的接口类型或非接口视图的企业 Bean。

如果它在模块中找到正好一个实现该接口或非接口视图的企业 Bean,那么它将使用该企业 Bean 作为 EJB 引用的目标。如果该容器在此模块中找不到该类型的企业 Bean,那么它会将搜索范围扩展至此模块所属的应用程序,然后在该应用程序中搜索与引用模块一样被指定给同一应用程序服务器的其他模块。此外,如果容器在应用程序的其他模块(已指定给引用模块所在的服务器)中找到正好一个实现目标接口或非接口视图的企业 Bean,那么它将使用该企业 Bean 作为引用目标。

自动链接的范围限于 EJB 引用所在的应用程序及指定了引用模块的应用程序服务器。对另一应用程序中的企业 Bean、指定给另一应用程序服务器的模块中的企业 Bean 或者位于已指定给 WebSphere Application Server 集群的模块中的企业 Bean 的引用,都必须使用 EJB 模块的 ibm-ejb-jar-bnd.xml 文件或者 Web 模块的 ibm-web-bnd.xmi 文件中的引用目标绑定来显式地解析。

必须注意,虽然 EJB 容器、Web 容器和应用程序客户机容器支持自动链接,但仅 EJB 引用支持自动链接,其他类型的引用均不支持。此外,由于自动链接功能的作用域限制为将引用模块指定到的服务器(如果是 Java EE 客户机容器,那么是客户机容器已配置为其 JNDI 引导服务器的服务器),所以它主要用于开发环境和其他单服务器使用方案。即使存在这些局限性,但由于无需显式解析 EJB 引用,所以它在开发过程中很有价值。

EJB 以及资源引用和注入的解决方案:查询功能

EJB 3.1 规范将查询功能定义为通过显式 JNDI 名称解析对 EJB 或资源的引用的机制。可以对 javax.ejb.EJB 或 javax.annotation.Resource 注释指定 lookup 属性。在下列其中一个元素上,ejb-jar.xml 文件中相应的 XML 属性是 <lookup-name>:<ejb-ref>、<ejb-local-ref>、<env-entry>、<resource-ref>、<resource-env-ref> 或 <message-destination-ref>。lookup 或 <lookup-name> 是与 java:comp/env 命名上下文相对的 JNDI 名称。

在 EJB 引用上,lookup 或 <lookup-name> 不得与 beanName 或 <ejb-link> 一起指定。管理控制台会将 lookup-name 和 ejb-link 显示为只读。但是,如果在应用程序安装步骤“将 EJB 引用映射至 Bean”中指定了 JNDI 名称,那么它将覆盖 lookup-name 或 ejb-link 值。

覆盖应用程序中定义的环境条目

应用程序可使用适合进行单元测试但不适合集成测试或生产用途的值来定义环境条目。如果要覆盖环境条目值,那么可将以下元素添加至对应绑定文件:
<env-entry name=name value=value/>
其中 name 是在应用程序中定义 env-entry 时所使用的名称,value 是指定给以字符串格式表示的 env-entry 的值。value 的字符串是根据环境条目的类型进行解析的,就好像使用 env-entry-value 在部署描述符中指定了该值一样。例如,
<env-entry name="java:module/env/taxYear" value="2010"/>
使名为“java:module/env/taxYear”的 env-entry 与值“2010”相关联。
或者,可将 env-entry 配置为可通过 JNDI 访问的另一对象的引用。从 JNDI 查询返回的对象将用作 env-entry 值。该选项的元素已具有以下格式:
<env-entry name="name" binding-name="lookupName"/>
其中 name 是在应用程序中定义 env-entry 时所使用的名称,lookupName 是应用于对缺省初始上下文执行的查找时解析的 JNDI 名称。例如,
<env-entry name="java:module/env/taxYear" binding-name="cell/persistent/MyApp/MyModule/taxYear"/>
使名为“java:module/env/taxYear”的 env-entry 与从针对“cell/persistent/MyApp/MyModule/taxYear”执行的缺省初始上下文查询操作返回的值相关联。您将负责创建 JNDI 对象绑定。绑定对象的类必须可指定给关联 env-entry 的对象类型。

可在应用程序级别及 EJB、Web 和客户机模块中定义环境条目。这些级别对应于绑定文件 application-bnd.xmlejb-jar-bnd.xmlweb-app-bnd.xmlapplication-client-bnd.xml

覆盖数据源定义

通过 Java EE 6,可开发使用 @DataSourceDefinition 注释或 <data-source> 部署描述符条目来定义数据源的应用程序。

应用程序应查找资源引用而不是直接查找数据源定义。如果要安装包含直接查找数据源定义操作的现有应用程序,并且希望此应用程序使用另一数据源定义,那么可使用解析至您创建的受管资源的绑定来覆盖此数据源定义。通过将以下元素添加至绑定文件来创建绑定:
<data-source name="name" binding-name="lookupName"/> 
其中 name 是在应用程序中定义 env-entry 时所使用的名称,lookupName 是应用于对缺省初始上下文执行的查找时解析的 JNDI 名称。例如,
<data-source name="java:module/env/myDS" binding-name="jdbc/DB2DS"/>
导致对“java:module/env/myDS”的查询解析为与名称“jdbc/DB2DS”绑定在一起的数据源(相对于缺省初始上下文)。例如,可通过管理控制台创建绑定在 jdbc/DB2DS 下的数据源。

可在应用程序级别及 EJB、Web 和客户机模块中定义数据源。这些级别对应于绑定文件 application-bnd.xmlejb-jar-bnd.xmlweb-app-bnd.xmlapplication-client-bnd.xml

集群环境和跨服务器环境中的命名注意事项

前面各个部分中的传统全局 JNDI 命名约定在非集群环境中以及在查询目标位于查询源所在的集群中时适用。从集群外部对给定集群中的绑定执行查询时,必须根据以下约定对查询字符串进行限定以指示目标所在的集群的名称:
cell/clusters/<cluster-name>/<name-binding-location>   
例如,假定 EJB 接口绑定位置在应用程序服务器根上下文中:
ejb/Department549/AccountProcessors/CheckingAccountReconciler  
如果将实现此接口的 EJB 指定给隶属于名为 Cluster47 的集群的应用程序服务器,那么该集群外部的查询字符串如下所示:
cell/clusters/Cluster47/ejb/Department549/AccountProcessors/CheckingAccountReconciler
跨应用程序服务器进程执行查询时,必须根据以下约定对查询字符串进行限定以指示目标所在的节点和服务器的名称:
cell/nodes/<node-name>/servers/<server-name>/<name binding location> 
再次假定 EJB 接口绑定位置在应用程序服务器根上下文中:
ejb/Department549/AccountProcessors/CheckingAccountReconciler 
如果将实现此接口的企业 Bean 指定给位于节点 S47NLA1 上的应用程序服务器 Server47A1,那么跨服务器查询字符串如下所示:
cell/nodes/S47NLA1/servers/Server47A1/ejb/Department549/AccountProcessors/CheckingAccountReconciler 

用户定义的 EJB 扩展设置

如果要为 WebSphere Application Server EJB 扩展设置指定值,那么您可以使用 EJB 模块扩展文件来将这些设置指定给该模块中的特定 EJB 类型。根据定义的扩展的类型,通过将这些文件中的一个或两个放入 EJB JAR 文件的 META-INF 目录中,可以指定 EJB 3.x 模块的扩展设置信息。这两个文件的名称为 ibm-ejb-jar-ext.xmlibm-ejb-jar-ext-pme.xml

注: 这些文件的后缀为 XML,而不是 XMI,这与先前版本的 WebSphere Application Server 的情况不同。
ibm-ejb-jar-ext.xmlibm-ejb-jar-ext-pme.xml 文件用于在 WebSphere Application Server 中运行的 EJB 3.x 模块,而 ibm-ejb-jar-ext.xmiibm-ejb-jar-ext-pme.xmi 文件用于版本低于 3.0 的 EJB 模块。由于下列原因,WebSphere Application Server V8.0 使用新的基于 XML 的扩展文件格式,而不是使用先前的 .xmi 文件格式:
  1. xmi 文件格式中声明的绑定和扩展取决于是否存在对应的 ejb-jar.xml 部署描述符文件,该文件显式地引用该文件中的元素所连接的唯一标识编号。此系统对于 EJB 3.0 和更高版本的模块不再可行,在这些版本中,不再要求模块包含 ejb-jar.xml 部署描述符。
  2. xmi 文件格式设计为仅由 WebSphere 开发工具和系统管理功能进行机器编辑;实际上,它原先是 WebSphere 内部实现的一部分,并且该文件的结构从未在外部加以记录。这使得开发者无法手动创建或编辑绑定或扩展文件,也无法以受支持的方式在独立于 WebSphere 的构建过程中创建这些文件。
  3. 基于 XML 的扩展文件格式不是引用 ejb-jar.xml 中已编码的标识号,而是通过其 EJB 名称来引用 EJB 组件。模块中的每个 EJB 组件保证具有唯一的 EJB 名称(缺省值或由开发者显式指定的值),因此这提供了一种明确的方法来定位绑定和扩展。
  4. 新的绑定和扩展文件格式基于 XML,并提供了 XML 模式定义 (xsd) 文件以便在外部记录它们的结构。这些 .xsd 文件可供许多公共 XML 文件编辑器使用以帮助执行语法验证和代码补全功能。因此,开发者现在可使用通用 XML 编辑器或他们所选的脚本编制系统独立于 WebSphere Application Server 基础结构生成并编辑这些绑定和扩展文件。

在 META-INF/ibm-ejb-jar-ext.xml 中定义的扩展

下列各表概述了必须放在 META-INF/ibm-ejb-jar-ext.xml 文件中的扩展元素和属性。接下来的一节列出了显示在另一文件 META-INF/ibm-ejb-jar-ext-pme.xml 中的元素和属性。
表 4. META-INF/ibm-ejb-jar-ext.xml 文件的元素和属性. META-INF/ibm-ejb-jar-ext.xml 文件的元素和属性
元素或属性 描述 示例 使用说明
<session> 为会话 Bean 声明一组扩展设置。
<session name="AccountServiceBean"/>
需要 name 属性。为了有效,还应该包含至少一个扩展设置定义子元素。
<message-driven> 为消息驱动的 Bean 声明一组扩展设置。
<message-driven name="EventProcessorBean"/>
需要 name 属性。为了有效,还应该包含至少一个扩展设置定义子元素。
表 5. META-INF/ibm-ejb-jar-ext.xml 文件的元素和属性. META-INF/ibm-ejb-jar-ext.xml 文件的元素和属性
元素或属性 描述 示例 使用说明
<time-out> <session> 元素的子元素(可选),用于声明方法调用之间的秒数,在该秒数后,有状态会话 Bean 可能不再可用。
<session
 name="ShoppingCartBean">
 <time-out value="600"/>
</session>
需要 value 属性(正整数)。
注: 仅适用于有状态会话 Bean;不得用于无状态 Bean。

属性缺省值:300(5 分钟)

<bean-cache> <session> 元素的子元素,用于声明有状态会话 Bean 的 Bean 激活/钝化设置。
<session
 name="ShoppingCartBean">
 <bean-cache
  activation-policy="TRANSACTION"/>
</session>
为了有效,还应包括 activation-policy 属性。
activation-policy <bean-cache> 元素的属性,它声明可激活和钝化 Bean 实例的条件。应用于有状态会话 Bean。允许的值及其含义为:
  • TRANSACTION:表示 Bean 在事务开始时激活并在事务结束时钝化(并会从活动的 EJB 实例高速缓存除去)。
  • ONCE:表示 Bean 在服务器进程中首次被访问时激活,并在容器离散(例如高速缓存变满)时钝化(并会从活动的 EJB 实例高速缓存除去)。
  • ACTIVITY_SESSION:指示 Bean 按如下所示激活和钝化:
    1. 在 ActivitySession 边界上,如果激活时存在 ActivitySession 上下文
    2. 在事务边界上,如果激活时存在事务上下文(但是不存在 ActivitySession 上下文),否则
    3. 在调用边界上。
<session
 name="ShoppingCartBean">
 <bean-cache
  activation-policy="ONCE"/>
</session>
属性缺省值:ONCE 用于有状态会话 Bean。
表 6. META-INF/ibm-ejb-jar-ext.xml 文件的元素和属性. META-INF/ibm-ejb-jar-ext.xml 文件的元素和属性
元素或属性 描述 示例 使用说明
<global-transaction> <session> 和 <message-driven> 元素的子元素,可以用于声明要在此特定 EJB 类型启动的事务中使用的事务超时(以秒计)(将覆盖全局事务超时的服务器设置),并且还可以声明此 EJB 类型是否在异构 Web Service 环境中传播通过 Web Service 原子事务接收到的全局事务上下文。
<session
 name="AccountServiceBean"
 <global-transaction
  <global-transaction
 transaction-time-out="180" 
  send-wsat-context="FALSE"/>
</session>
至少需要 transaction-time-out 或 send-wsat-context 属性的其中一个。

属性缺省值:transaction-time-out 的缺省值为服务器事务超时设置;send-wsat-context 的缺省值为 FALSE

<local-transaction> <session> 和 <message-driven> 元素的子元素,可用于声明与局部事务相关的设置。 受支持的属性为 boundary、resolver 和 unresolved-action;这些属性为组件配置容器的局部事务包含范围 (LTC) 环境的行为,只要不存在全局事务,容器都会建立此环境。每个属性的含义为:

边界

此设置指定容器边界,必须在此处完成所有包含的资源管理器局部事务 (RMLT)。可能的值是:
  • BEAN_METHOD:这是缺省值。如果选择此选项,那么必须在启动 RMLT 的 Bean 方法中解析这些 RMLT。
  • ACTIVITY_SESSION:RMLT 必须在启动它们的任何 ActivitySession 的范围中进行解析,如果没有 ActivitySession 上下文,那么必须在启动它们的同一 Bean 方法中进行解析。

解析器

此设置指定负责启动和结束 RMLT 的组件。可能的值是:
  • APPLICATION:这是缺省值。应用程序负责启动 RMLT 并在局部事务容器 (LTC) 范围内完成它们。根据未解析操作属性的值,在 LTC 范围末尾未完成的所有 RMLT 将被容器清除。
  • CONTAINER_AT_BOUNDARY:容器负责启动 RMLT 并在 LTC 范围中完成它们。第一次在 LTC 范围内使用连接时,容器将开始 RMLT,并且会在 LTC 范围末尾自动完成它。如果边界设置为 ActivitySession,那么 RMLT 将登记为 ActivitySession 资源并且由 ActivitySession 引导完成。如果边界设置为 BeanMethod,那么 RMLT 将由容器在方法结束时落实。

未解析的操作

此设置指定容器请求 RMLT 执行的指令(如果那些事务在 LTC 范围末尾未解析,并且解析器设置为“应用程序”)。可能的值是:
  • ROLLBACK:这是缺省值。在 LTC 范围末尾,容器将指导所有未解析的 RMLT 回滚。
  • COMMIT:在 LTC 范围末尾,容器将指导所有未解析的 RMLT 落实。容器指示 RMLT 仅在不存在未处理异常的情况下进行落实。如果在局部事务上下文中运行的应用程序方法结束并产生异常,那么容器将回滚所有未解析的 RMLT。此行为与全局事务的行为相同。
<session
 name>="AccountServiceBean">
 <local-transaction
  boundary="BEAN_METHOD" 
  resolver="APPLICATION" 
  unresolved-action="ROLLBACK"/>
</session>
至少需要 boundary、resolver 或 unresolved-action 属性的其中一个。
属性缺省值:
boundary="BEAN_METHOD";
resolver="APPLICATION";
unresolved-action=
"ROLLBACK"
表 7. META-INF/ibm-ejb-jar-ext.xml 文件的元素和属性. META-INF/ibm-ejb-jar-ext.xml 文件的元素和属性
元素或属性 描述 示例 使用说明
<method> <method-session-attribute> 和 <run-as-mode> 元素的子元素,用于指定可应用给定设置的方法名称、方法签名或方法类型。 受支持的属性为 type、name 和 params。按如下所示描述了每个属性:

type

  • UNSPECIFIED:此设置适用于与 name 属性和 params 属性相匹配的所有方法,而不用考虑接口类型。
  • REMOTE:此设置适用于与 name 属性和 params 属性相匹配的远程业务接口和远程组件接口方法。
  • LOCAL:此设置适用于与 name 属性和/或 params 属性相匹配的本地业务接口、本地组件接口方法和非接口视图。
  • HOME:此设置适用于与 name 属性和 params 属性相匹配的远程 Home 接口方法。
  • LOCAL_HOME:此设置适用于与 name 属性和 params 属性相匹配的本地 Home 接口方法。
  • SERVICE_ENDPOINT:此设置适用于 JAX-RPC 服务端点接口上与 name 属性和 params 属性相匹配的方法。

name

此设置将应用于的方法的名称,如果此设置将应用于所有方法(无论名称如何),那么将使用星号 (*)。

params

此设置将应用于的方法的参数特征符。如果多种方法使用相同的名称,那么可以使用它来唯一地限定特定的方法。参数特征符是以逗号分隔的 Java 类型的列表。 基本类型仅通过其名称进行指定;非基本类型将通过其标准类或接口名称(包括任何 Java 包)进行指定,而 Java 类型的数组将通过数组元素的类型,后跟一个或多个成对的方括号进行指定(例如 int[][])。

<session
 /name="AccountServiceBean">
 <method-session-attribute
  type="REQUIRES_NEW">
 <method
  type="LOCAL"
  name="debitAccount" 
  params="java.lang.String[], int,
     com.xyz.CustomerInfo"/>
 </method-session-attribute;>
</session>
 
<run-as-mode> <session> 和 <message-driven> 元素的子元素,可用于声明在调用另一个方法时所给定的 EJB 方法将使用的安全身份。该标识可设置为使用调用者的标识(方式 = CALLER_IDENTITY)、EJB 服务器的标识(方式 = SYSTEM_IDENTITY)或者特定安全角色的标识(方式 = SPECIFIED_IDENTITY)。
<session
 name="AccountServiceBean">
 <run-as-mode
   mode="SPECIFIED_IDENTITY">
 <specified-identity
   role="admin"/>
 <method type="UNSPECIFIED" 
   name="testRunAsRole"/>
 </run-as-mode>
</session>
需要 mode 属性和 <method> 子元素。如果方式为 SPECIFIED_IDENTITY,那么还需要 <specified-identity 子元素。
<start-at-app-start> <session> 和 <message-driven> 元素的子元素,可用于通知 EJB 容器可在首次启动应用程序时而不是应用程序首次使用指定的 EJB 类型时对该 EJB 类型进行初始化。
<session
 name="AccountServiceBean">
 <start-at-app-startvalue="TRUE"/>
</session>
需要 value 属性。

属性缺省值:对于消息驱动的 Bean 以外的 Bean 均为 FALSE(应用程序首次使用 EJB 时对 EJB 类型进行初始化)。对于消息驱动的 Bean 总是为 TRUE。

<resource-ref> <session> 和 <message-driven> 元素的子元素,可用于声明 Java EE 资源引用上的其他设置,例如要在通过连接(由引用进行引用)驱动的事务上使用的隔离级别。允许的属性包括 isolation-level。属性定义为如下所示:
isolation-level
  • TRANSACTION_REPEATABLE_READ:此隔离级别禁止脏读取和非重复读取,但是它允许幻象读取。
  • TRANSACTION_READ_COMMITTED:此隔离级别禁止脏读取,但是允许非重复读取和幻象读取。
  • TRANSACTION_READ_UNCOMMITTED:此隔离级别允许读取未落实的更改(由正在进行的其他事务更改的数据)。它还允许脏读取、非重复读取和幻象读取。
  • TRANSACTION_SERIALIZABLE:此隔离级别禁止执行下列类型的读取:
    1. 脏读取,在这种情况下,事务将读取其中包含第二个事务中未落实的更改的数据库行,
    2. 非重复读取,在这种情况下,一个事务将读取一行,第二个事务将更改同一行,并且第一个事务将重新读取该行并获取另外的值,以及
    3. 幻象读取,在这种情况下,一个事务将读取所有满足 SQL WHERE 条件的行,第二个事务将插入也满足 WHERE 条件的行,第一个事务将应用相同的 WHERE 条件并获取第二个事务所插入的行。
  • TRANSACTION_NONE:此隔离级别表示在此类型的资源上不支持事务。
<session
 name="AccountServiceBean">
 <resource-ref
  name="jdbc/Default" 
  isolation-level="TRANSACTION_NONE">
</session>
需要 name 属性。为了有效,还应包括 isolation-level 属性。

在 META-INF/ibm-ejb-jar-ext-pme.xml 文件中定义的扩展

以下各表列示必须放在 META-INF/ibm-ejb-jar-ext-pme.xml 文件中的扩展元素和属性。
表 8. META-INF/ibm-ejb-jar-ext-pme.xml 中定义的扩展. 在 META-INF/ibm-ejb-jar-ext-pme.xml 中定义的扩展
元素或属性 描述 示例 使用说明
<internationalization> 可用于声明 EJB 类型可使用的语言环境(调用者的语言环境或服务器的语言环境)的元素。
<internationalization>
  <application>
   <ejb name="S01"/>
   <ejb name="S02"/>
  </application>
  <run-as-caller>
   <method type="LOCAL" name="getFoo" params="int">
     <ejb name="C01"/>
   </method>
  </run-as-caller>
  <run-as-server>
   <method type="LOCAL" name="getBar" params="int">
    <ejb name="C02"/>
   </method>
  </run-as-server>
  <run-as-specified name="North American English">
   <locale lang="en" country="US" variant="foo"/>
   <locale lang="en" country="CA" variant="bar" /> 
   <time-zone name="GMT"/> 
   <method type="LOCAL" name="getFoo" params="int"> 
    <ejb name="C03"/>
   </method>
  </run-as-specified>
  <run-as-specified name="North American French"> 
   <locale lang="fr" country="US" variant="foo"/>
   <locale lang="fr" country="US" variant="bar" /> 
   <time-zone name="GMT"  /> 
   <method type="LOCAL" name="getBar" params="int"> 
   <ejb name="C04"/>
   </method>
  </run-as-specified>
</internationalization>
有关此扩展的信息,请参阅“容器国际化属性:WebSphere Application Server”。

由于此功能比较复杂,因此您可能想要使用为 WebSphere Application Server 设计的工具(例如,Rational® Application Developer)来生成所需要的扩展文件节,然后根据需要修改 XML 文件。

<activity-sessions> 此元素可以声明要在指定的会话 Bean(BEAN 或 CONTAINER)上使用的活动会话管理的类型,对于容器管理的活动会话,可以声明容器要提供的活动会话行为的类型。
<activity-sessions>
 <container-activity-session 
  name="Foo" type="NOT_SUPPORTED">
  <methodtype="HOME" name="findByPrimaryKey"
    params="int">
   <ejb name="C01"/>
  </method>
 </container-activity-session>
<./activity-sessions>
有关此扩展的信息,请参阅“设置 EJB 模块 ActivitySession 部署属性”。

由于此功能比较复杂,因此您可能想要使用为 WebSphere Application Server 设计的工具(例如,Rational Application Developer)

<app-profiles> 可以声明一个或多个 EJB 文件的应用程序概要文件设置的元素。
<app-profiles>
 <defined-access-intent-policy name="foo">
  <collection-scope type"SESSION"/>
  <optimistic-read/>
  <read-ahead-hint hint="foo.bar.baz"/>
 </defined-access-intent-policy>
 <run-as-task 
  name="TestEJB1.ejbs.C01LocalHome.createjava.lang.Integer" 
  type="RUN_AS_SPECIFIED_TASK">
  <task name=“/>
  <method type="LOCAL" name="getFoo" params="int">
   <ejb name="C01"/>
  </method>
 </run-as-task>
 <ejb-component-extension ejb="C01"> 
  <task name="SomeTask"/>
 </ejb-component-extension>
</app-profiles>
由于此功能比较复杂,因此您可能想要使用为 WebSphere Application Server 设计的工具(例如,Rational Application Developer)来生成所需要的扩展文件节,然后根据需要修改 XML 文件。

旧的 (XMI) 绑定

现有模块和应用程序可继续使用产品中提供的旧绑定支持,因此,可使用现有工具和向导为应用程序和模块指定绑定和扩展信息。旧支持仅适用于使用 J2EE 1.4 样式的 XML 部署描述符的 EAR 文件和模块。

使用 V3.x XML 部署描述符模式或没有 XML 部署描述符文件的 EJB 模块必须使用缺省绑定和自动链接或者用户指定的 XML 绑定文件。

必须始终用 2.1 XML 部署描述符模式版本将 CMP 实体 Bean 打包在模块中,以便可以使用现有工具来提供映射、绑定和扩展支持。

用户指定的 XML 绑定

每个接口的缺省绑定和每个引用的自动链接引用解析均可以通过在创建的 META-INF/ibm-ejb-jar-bnd.xml 文件中指定 EJB 模块的绑定来覆盖。

描述该格式的模式文件位于 <WAS_HOME>/properties/schemas 目录中。这种格式的绑定规范只能用于不包含 XML 部署描述符或者包含 EJB 3.x 部署描述符的模块。
注: 不必要指定所有绑定。任何未定义的绑定名称或引用均使用缺省绑定和自动链接支持。
可以为下列 Bean 指定绑定:
  • 使用 <session> 元素的会话 Bean
  • 使用 <message-driven> 元素的消息驱动的 Bean
<session> 元素仅支持以下属性和子元素:
  • id 属性
  • name 属性
  • simple-binding-name 属性
  • component-id 属性
  • ejb-ref 元素
  • resource-ref 元素及其属性
  • resource-env-ref 元素及其属性
  • message-destination-ref 元素及其属性
  • env-entry 元素
  • data-source 元素
<message-driven> 元素仅支持以下属性和子元素:
  • id 属性
  • name 属性
  • jca-adapter 属性
  • ejb-ref 元素及其属性
  • resource-ref 元素及其属性
  • resource-env-ref 元素及其属性
  • message-destination-ref 元素及其属性
  • env-entry 元素
  • data-source 元素

指示主题类型的图标 概念主题



时间戳记图标 最近一次更新时间: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=cejb_bindingsejbfp
文件名:cejb_bindingsejbfp.html