我在Payara上部署的Java EE应用程序中看到了以下代码:
public class MyClass {
@Resource
ManagedScheduledExecutorService scheduler;
<...>
}
这是一个启用 CDI 的应用程序,如果这有所作为的话。 在 Payara 中,存在一个用于 ManagedScheduledExecutorService 的资源,其 JNDI 名称为concurrent/__defaultManagedScheduledExecutorService
,逻辑 JNDI 名称为java:comp/DefaultManagedScheduledExecutorService
。
资源的 JNDI 名称是根据类名和字段创建的。这与上述名称不匹配。
到目前为止,我对资源注入的理解是,您使用 lookup 属性纯粹按名称引用现有的 JNDI 条目。但如您所见,没有使用任何属性,它仍然有效。
为什么?是否有特定于容器的回退机制,或者某些 Java 规范是否定义了此行为?
事实上,"某些Java规范定义了这种行为"是适用的。
事实上,Java EE 7/8 规范中的§EE.5.21 缺省并发实用程序对象提供了以下定义:
Java EE产品提供程序必须使应用程序可以使用以下 JNDI 名称访问 Java EE 对象的缺省并发实用程序:
- 预配置的托管执行程序服务的
java:comp/DefaultManagedExecutorService
- 预配置的托管计划执行程序服务的
java:comp/DefaultManagedScheduledExecutorService
- 预配置的托管线程工厂的
java:comp/DefaultManagedThreadFactory
- 预配置上下文服务的
java:comp/DefaultContextService
应用程序组件提供程序或部署程序可以使用资源批注的查找元素或资源引用部署描述符元素的查找名称元素,将资源引用显式绑定到默认并发实用程序对象。例如
@Resource(name="myManagedExecutorService, lookup="java:comp/DefaultManagedExecutorService") ManagedExecutorService myManagedExecutorService;`
如果没有此类绑定,引用的映射将默认为产品的默认托管执行程序服务。