Java EE 应用程序资源声明
可以配置 Java™ Enterprise Edition (Java EE) 应用程序以声明外部资源与配置参数之间的依赖关系。可以将这些资源注入到应用程序代码,或者应用程序可以通过 Java 命名和目录接口 (JNDI) 来访问这些资源。
资源引用允许应用程序定义和使用逻辑名;部署应用程序时,可以将逻辑名绑定至资源。
Java EE 应用程序可以声明下列资源类型:简单的环境条目、Enterprise JavaBeans (EJB) 引用、Web Service 引用、资源管理器连接工厂引用、资源环境引用、消息目标引用、持久性单元引用以及持久上下文引用。
简单的环境条目
可以在 Java EE 应用程序中定义配置参数,以使用简单的环境条目来定制业务逻辑。如 Java EE 6 应用程序中所述,简单的环境条目值可能为下列其中一种 Java 类型:String、Character、Bye、Short、Integer、Long、Boolean、Double、Float、Class 以及 Enum 的任何子类。
应用程序提供者必须声明从应用程序代码访问的所有简单的环境条目。使用应用程序代码中的注释 (javax.annotation.Resource) 或者使用 XML 部署描述符中的 env-entry 元素来声明简单的环境条目。
在应用程序中的以下示例中,注释声明了环境条目:
// Retry interval in milliseconds
@Resource long retryInterval = 3000;
在前一个示例中,字段缺省值为 3000。可以使用您在 XML 部署描述符中定义的 env-entry-value 来更改此值。
在以下示例中,应用程序声明了类型为 Class 的简单环境条目,并且定义使用 XML 部署描述符中的 env-entry-value 元素来注入 Class。
@Resource(name=TraceFormatter) Class<?> traceFormatter;
<env-entry>
<env-entry-name>TraceFormatter</env-entry-name>
<env-entry-value>com.sample.trace.StdOutTraceFormatter</env-entry-value>
</env-entry>
在前一个示例中,字段值设置为 Class 对象 com.sample.trace.StdOutTraceFormatter。
在以下示例中,应用程序将一个称为 validationMode 的简单环境条目在 com.sample.Order 类中声明为 Enum 的子类,并配置 Enum 值 CALLBACK 以使用 XML 部署描述符中的元素来注入。
<env-entry>
<env-entry-name>JPAValidation</env-entry-name>
<env-entry-type>javax.persistence.ValidationMode</env-entry-type>
<env-entry-value>CALLBACK</env-entry-value>
<injection-target>
<injection-target-class>com.sample.Order</injection-target-class>
<injection-target-name>validationMode</injection-target-name>
</injection-target>
</env-entry>
在前一个示例中,validationMode 字段设置为 Enum 值 CALLBACK。当您使用注释和 XML 代码来声明简单环境条目时,请使用同样的方法;例如:
@Resource (name=JPAValidation)
javax.persistence.ValidationMode validationMode;
<env-entry>
<env-entry-name>JPAValidation</env-entry-name>
<env-entry-value>CALLBACK</env-entry-value>
</env-entry>
Enterprise JavaBeans (EJB) 引用
如 Java EE 6 规范中所述,您可以开发 Java EE 应用程序,以使用称为 EJB 引用的逻辑名来声明对于企业 Bean home 接口或企业 Bean 实例的引用。
当应用程序声明对于 EJB 的引用时,将使用下列其中一项技术来解析您引用的 EJB。
- 在 ibm-ejb-jar-bnd.xml 文件或 ibm-web-bnd.xml 文件中指定 EJB 绑定
- 在 ejb-jar.xml 文件或 web.xml 文件中指定 <ejb-link> 元素
- 对 javax.ejb.EJB 注释指定 beanName 属性
- 在 ejb-jar.xml 文件或 web.xml 文件中指定 <lookup-name> 元素
- 对 javax.ejb.EJB 注释指定 lookup 属性
- 查找用于实现声明为 EJB 引用的类型的接口(称为 AutoLink)的企业 Bean。
EJB 容器尝试使用前面的技术并按它们的列示顺序来解析 EJB 引用。
在以下示例中,应用程序将使用注释来声明 EJB 引用,并提供绑定以进行解析。
@EJB(name="Cart")
Cart shoppingCart;
<ejb-ref name="Cart" binding-name="java:app/SampleEJB/SampleCart"/>
在以下示例中,应用程序将使用注释来声明 EJB 引用,并提供 ejb-link 元素以进行解析。
@EJB(name="Cart")
Cart shoppingCart;
<ejb-local-ref>
<ejb-ref-name>Cart</ejb-ref-name>
<ejb-link>SampleEJB/SampleCart</ejb-link>
</ejb-local-ref>
在以下示例中,应用程序将使用注释来声明 EJB 引用,并在源 Bean com.sample.SourceBean 中提供 lookup 属性以进行解析。
@EJB(name="Cart" lookup="java:app/SampleEJB/SampleCart")
Cart shoppingCart;
应用程序可以选择在 XML 部署描述符中使用 <lookup-name> 元素来声明 EJB 引用,如以下示例中所示。
<ejb-local-ref>
<ejb-ref-name>Cart</ejb-ref-name>
<lookup-name>java:app/SampleEJB/SampleCart</lookup-name>
<injection-target>
<injection-target-class>com.sample.SourceBean</injection-target-class>
<injection-target-name>ShoppingCart</injection-target-name>
</injection-target>
</ejb-local-ref>
在以下示例中,应用程序将使用注释来声明 EJB 引用,并提供 beanName 属性以进行解析。
@EJB(name="Cart" beanName="SampleEJB/SampleCart")
Cart shoppingCart;
资源环境引用
如 Java EE 6 规范中所述,您可以开发应用程序以声明对与资源(例如,连接器 CCI InteractionSpec 实例)相关联的受管对象或者由 EJB 容器管理的其他对象类型(其中包括 javax.transaction.UserTransaction、javax.ejb.EJBContext、javax.ejb.TimerServcie、org.omg.CORBA.ORB、javax.validation.Validator、javax.validation.ValidatorFactory 或 javax.enterprise.inject.spi.BeanManager)的引用。
在部署应用程序之后,当应用程序声明对于受管对象的引用时,您必须提供与该受管对象的绑定。当您部署应用程序时,可以使用管理控制台来提供此绑定,也可以将此绑定添加至 WebSphere® 绑定 XML 文件 ibm-ejb-jar-bnd.xml 或 ibm-web-bnd.xml。
在以下示例中,应用程序将声明资源环境引用,并提供与该资源的绑定:
@Resource(name="jms/ResponseQueue")
Queue responseQueue;
<session name="StatelessSampleBean">
<resource-env-ref name="jms/ResponseQueue" binding-name="Jetstream/jms/ResponseQueue"/>
</session>
应用程序可以选择使用 lookup 属性来声明资源环境引用,不需要绑定,如以下示例所示:
@Resource(name="jms/ResponseQueue", lookup="Jetstream/jms/ResponseQueue")
Queue responseQueue;
<resource-env-ref>
<resource-env-ref-name>jms/ResponseBean</resource-env-ref-name>
<resource-env-ref-type>javax.jms.Queue</resource-env-ref-type>
</resource-env-ref>
当应用程序声明对于容器管理的对象类型的引用时,未使用绑定。容器将提供所引用对象的正确实例。在以下示例中,应用程序将声明对于容器管理的对象的资源环境引用:
@Resource
javax.validation.Validator validator;
资源引用的资源引用
@Resource(name="java:global/env/jdbc/ds1ref",
lookup="java:global/env/jdbc/ds1",
authenticationType=Resource.AuthenticationType.APPLICATION,
shareable=false)
DataSource ds1ref;
@Resource(name="java:global/env/jdbc/ds1refref",
lookup="java:global/env/jdbc/ds1ref",
authenticationType=Resource.AuthenticationType.APPLICATION,
shareable=true)
DataSource ds1refref;
查询使用引用的最深入嵌套,在本例中为“java:global/env/jdbc/ds1ref”。