Bean 提供者必须声明从企业bean 代码中访问的所有环境条目。这些环境条目通过在bean 类代码中使用注释符或在部署描述中使用env-entry 元素来声明。
每个env-entry 描述了一个环境条目。它由一个可选的环境条目描述、相对于java:comp/env 的环境条目名称、期望的环境条目值的类型(也就是,从EJBContext 或JNDI 的lookup 方法返回的对象的类型)和一个可选的环境条目值组成。
环境条目的范围是企业bean,它的部署描述元素要包含给定的env-entry 元素。这意味着在运行时其他企业bean 是不能获取这些环境条目的,且其他企业bean 也可以使用相同的env-entry-name 而不会引起命名冲突。
如果Bean 提供者使用env-entry-value 元素为环境条目提供了它的值,那么这个值可以在以后被应用组装者或部署者改变。这个值必须是一个有效的字符串(有效指的是可以使用类型的带单个String 参数的构造器来构造出相应的类型),或者对于java.lang.Character 来说,是一个字符。
下面的例子是声明由EmployeeServiceBean 使用的环境条目。
<enterprise-beans>
<session>
...
<ejb-name>EmployeeService</ejb-name>
<ejb-class>com.wombat.empl.EmployeeServiceBean</ejb-class>
...
<env-entry>
<description>
The maximum number of tax exemptionsallowed to be set.
</description>
<env-entry-name>maxExemptions</env-entry-name>
<env-entry-type>java.lang.Integer</env-entry-type>
<env-entry-value>15</env-entry-value>
</env-entry>
<env-entry>
<description>
The minimum number of tax exemptions
allowed to be set.
</description>
<env-entry-name>minExemptions</env-entry-name>
<env-entry-type>java.lang.Integer</env-entry-type>
<env-entry-value>1</env-entry-value>
</env-entry>
<env-entry>
<env-entry-name>foo/name1</env-entry-name>
<env-entry-type>java.lang.String</env-entry-type>
<env-entry-value>value1</env-entry-value>
</env-entry>
<env-entry>
<env-entry-name>foo/bar/name2</env-entry-name>
<env-entry-type>java.lang.Boolean</env-entry-type>
<env-entry-value>true</env-entry-value>
</env-entry>
<env-entry>
<description>Some description.</description>
<env-entry-name>name3</env-entry-name>
<env-entry-type>java.lang.Integer</env-entry-type>
</env-entry>
<env-entry>
<env-entry-name>foo/name4</env-entry-name>
<env-entry-type>java.lang.Integer</env-entry-type>
<env-entry-value>10</env-entry-value>
</env-entry>
...
</session>
</enterprise-beans>
...
环境条目的注入也可以使用部署描述来指导,而不需要java 语言的注释符。
下面是对应的环境条目的声明。
<enterprise-beans>
<session>
...
<ejb-name>EmployeeService</ejb-name>
<ejb-class>com.wombat.empl.EmployeeServiceBean</ejb-class>
...
<env-entry>
<description>
The maximum number of tax exemptionsallowed to be set.
</description>
<env-entry-name>
com.wombat.empl.EmployeeService/maxExemptions
</env-entry-name>
<env-entry-type>java.lang.Integer</env-entry-type>
<env-entry-value>15</env-entry-value>
<injection-target>
<injection-target-class>
com.wombat.empl.EmployeeServiceBean
</injection-target-class>
<injection-target-name>
maxExemptions
</injection-target-name>
</injection-target>
</env-entry>
<env-entry>
<description>
The minimum number of tax exemptionsallowed to be set.
</description>
<env-entry-name>
com.wombat.empl.EmployeeService/minExemptions
</env-entry-name>
<env-entry-type>java.lang.Integer</env-entry-type>
<env-entry-value>1</env-entry-value>
<injection-target>
<injection-target-class>
com.wombat.empl.EmployeeServiceBean
</injection-target-class>
<injection-target-name>
minExemptions
</injection-target-name>
</injection-target>
</env-entry>
...
</session>
</enterprise-beans>
...
除了在代码中指定缺省值外,将字段作为注入目标通常都是方便的。如下例解释的一样:
// The maximum number of tax exemptions, configured by the Deployer.
@Resource int maxExemptions = 4; // defaults to 4
为了支持这种情况,如果应用组装者或部署者已经指定了一个值覆盖了缺省值,那么容器必须只注入环境条目的值。当注入目标被指定时,在部署描述中的env-entry-value 元素是可选的。如果没有指定,则不注入值。另外,如果没有指定,命名的资源在命名上下文中不被初始化,且显式查找命名资源将会失败。
每个env-entry 描述了一个环境条目。它由一个可选的环境条目描述、相对于java:comp/env 的环境条目名称、期望的环境条目值的类型(也就是,从EJBContext 或JNDI 的lookup 方法返回的对象的类型)和一个可选的环境条目值组成。
环境条目的范围是企业bean,它的部署描述元素要包含给定的env-entry 元素。这意味着在运行时其他企业bean 是不能获取这些环境条目的,且其他企业bean 也可以使用相同的env-entry-name 而不会引起命名冲突。
如果Bean 提供者使用env-entry-value 元素为环境条目提供了它的值,那么这个值可以在以后被应用组装者或部署者改变。这个值必须是一个有效的字符串(有效指的是可以使用类型的带单个String 参数的构造器来构造出相应的类型),或者对于java.lang.Character 来说,是一个字符。
下面的例子是声明由EmployeeServiceBean 使用的环境条目。
<enterprise-beans>
<session>
...
<ejb-name>EmployeeService</ejb-name>
<ejb-class>com.wombat.empl.EmployeeServiceBean</ejb-class>
...
<env-entry>
<description>
The maximum number of tax exemptionsallowed to be set.
</description>
<env-entry-name>maxExemptions</env-entry-name>
<env-entry-type>java.lang.Integer</env-entry-type>
<env-entry-value>15</env-entry-value>
</env-entry>
<env-entry>
<description>
The minimum number of tax exemptions
allowed to be set.
</description>
<env-entry-name>minExemptions</env-entry-name>
<env-entry-type>java.lang.Integer</env-entry-type>
<env-entry-value>1</env-entry-value>
</env-entry>
<env-entry>
<env-entry-name>foo/name1</env-entry-name>
<env-entry-type>java.lang.String</env-entry-type>
<env-entry-value>value1</env-entry-value>
</env-entry>
<env-entry>
<env-entry-name>foo/bar/name2</env-entry-name>
<env-entry-type>java.lang.Boolean</env-entry-type>
<env-entry-value>true</env-entry-value>
</env-entry>
<env-entry>
<description>Some description.</description>
<env-entry-name>name3</env-entry-name>
<env-entry-type>java.lang.Integer</env-entry-type>
</env-entry>
<env-entry>
<env-entry-name>foo/name4</env-entry-name>
<env-entry-type>java.lang.Integer</env-entry-type>
<env-entry-value>10</env-entry-value>
</env-entry>
...
</session>
</enterprise-beans>
...
环境条目的注入也可以使用部署描述来指导,而不需要java 语言的注释符。
下面是对应的环境条目的声明。
<enterprise-beans>
<session>
...
<ejb-name>EmployeeService</ejb-name>
<ejb-class>com.wombat.empl.EmployeeServiceBean</ejb-class>
...
<env-entry>
<description>
The maximum number of tax exemptionsallowed to be set.
</description>
<env-entry-name>
com.wombat.empl.EmployeeService/maxExemptions
</env-entry-name>
<env-entry-type>java.lang.Integer</env-entry-type>
<env-entry-value>15</env-entry-value>
<injection-target>
<injection-target-class>
com.wombat.empl.EmployeeServiceBean
</injection-target-class>
<injection-target-name>
maxExemptions
</injection-target-name>
</injection-target>
</env-entry>
<env-entry>
<description>
The minimum number of tax exemptionsallowed to be set.
</description>
<env-entry-name>
com.wombat.empl.EmployeeService/minExemptions
</env-entry-name>
<env-entry-type>java.lang.Integer</env-entry-type>
<env-entry-value>1</env-entry-value>
<injection-target>
<injection-target-class>
com.wombat.empl.EmployeeServiceBean
</injection-target-class>
<injection-target-name>
minExemptions
</injection-target-name>
</injection-target>
</env-entry>
...
</session>
</enterprise-beans>
...
除了在代码中指定缺省值外,将字段作为注入目标通常都是方便的。如下例解释的一样:
// The maximum number of tax exemptions, configured by the Deployer.
@Resource int maxExemptions = 4; // defaults to 4
为了支持这种情况,如果应用组装者或部署者已经指定了一个值覆盖了缺省值,那么容器必须只注入环境条目的值。当注入目标被指定时,在部署描述中的env-entry-value 元素是可选的。如果没有指定,则不注入值。另外,如果没有指定,命名的资源在命名上下文中不被初始化,且显式查找命名资源将会失败。