我已经在Payara上部署的Java EE应用程序中看到以下代码:
public class MyClass {
@Resource
ManagedScheduledExecutorService scheduler;
<...>
}
如果有所作为,这是启用CDI的应用程序。
在Payara中,存在ManagedScheduledExecutorService的资源,其JNDI名称为concurrent/__defaultManagedScheduledExecutorService
,并且逻辑JNDI名称为java:comp/DefaultManagedScheduledExecutorService
。
根据类名称和字段创建资源的JNDI名称。这与上面的名称不匹配。
到目前为止,我对资源注入的理解是,您可以使用lookup属性纯粹按名称引用现有的JNDI条目。但是如您所见,没有使用任何属性,它仍然有效。
为什么?是否有特定于该容器的回退机制,或者某些Java规范定义了此行为?
答案 0 :(得分:1)
实际上是“一些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批注的lookup元素或resource-ref部署描述符元素的lookup-name元素,将资源引用显式绑定到默认的Concurrency Utilities对象。例如,
@Resource(name="myManagedExecutorService, lookup="java:comp/DefaultManagedExecutorService") ManagedExecutorService myManagedExecutorService;`
在没有这种绑定的情况下,引用的映射将默认为产品的默认托管执行程序服务。