小编典典

在Java EE6的类级别上声明@Resource和@EJB

java

仍然存在任何情况(鉴于Java EE6具有java:global /,app /,模块/命名标准),需要像下面的示例一样声明EJB或Resources?

@EJB (name = "ejb/PlaceBid", beanInterface = PlaceBid.class)
public class ActionBazaarBidControllerServlet extends HttpServlet {

}

在使用的助手类中查找PlaceBid ActionBazaarBidControllerServlet

PlaceBid placeBid = (PlaceBid)context.lookup("java:comp/env/ejb/PlaceBid");

阅读 210

收藏
2020-10-09

共1个答案

小编典典

java:comp/env/命名空间是有时有点了解的功能。该名称空间对应于所谓的Enterprise Naming Context(ENC)。

这就像与每个组件相关联的私有“哈希图”一样,整个Web模块被视为一个组件,而各个EJB Bean也分别被视为组件。

您将此私有名称空间主要用于 别名目的 。如果在“ ejb / PlaceBid”下映射某些内容,则所有(帮助程序)代码都可以使用“ ejb /
PlaceBid”,并且在一个全局位置(本例中为servlet,但也可以是XML)可以确定精确映射的内容对它。如果所有代码都直接发送java:global/...到该名称,则可能会有数十个硬编码依赖项。

因此,如果需要额外的重定向,则可以使用它。


其他注意事项:

1.使用EJB SessionContext,您可以直接按以下方式引用此名称空间:

PlaceBid placeBid = (PlaceBid)sessionContext.lookup("ejb/PlaceBid");

这里的“ ejb / PlaceBid”是ENC中的相对名称。

2.如上所述,ENC对于每个组件都是私有的。不同的EJB可以将给定的相对名称映射为不同的名称。context.lookup("java:comp/env/ejb/PlaceBid")因此可以根据调用的组件返回不同的内容。

3.从历史上看,ENC早于我们现在所说的 注入
。在某种程度上,当您以XML指定映射时,您将某些东西“注入”到与该组件关联的私有“哈希映射”中。现代版本注入字段,构造函数或属性(setter)中,而旧版本注入“键”中。

即使在EJB3.1中,历史上的“注入”机制仍然在后台运行。如果您在字段上使用@EJB执行看似正常的注入,那么这还将在JNDI ENC中自动创建一个条目。例如

package test;

@Stateless
public class MyBean {

   @EJB
   private MyService myService;

}

在这种情况下,注入到myService中的任何内容也将存储在ENC中,名称为java:comp/env/test.MyBean/myService。要使用您在Servlet上使用@EJB注释完成链接:您可以选择使用name属性指定在ENC中存储引用的名称:

@Stateless
public class MyBean {

   @EJB(name = "ejb/PlaceBid")
   private MyService myService;

}

有点反常理,但是在大多数情况下,name此处的属性并不是指向要注入对象的 来源的 东西,而是在ENC中用作注入 目标的对象

2020-10-09