仍然存在任何情况(鉴于Java EE6具有java:global /,app /,模块/命名标准),需要像下面的示例一样声明EJB或Resources?
@EJB (name = "ejb/PlaceBid", beanInterface = PlaceBid.class) public class ActionBazaarBidControllerServlet extends HttpServlet { }
在使用的助手类中查找PlaceBid ActionBazaarBidControllerServlet
ActionBazaarBidControllerServlet
PlaceBid placeBid = (PlaceBid)context.lookup("java:comp/env/ejb/PlaceBid");
该java:comp/env/命名空间是有时有点了解的功能。该名称空间对应于所谓的Enterprise Naming Context(ENC)。
java:comp/env/
Enterprise Naming Context
这就像与每个组件相关联的私有“哈希图”一样,整个Web模块被视为一个组件,而各个EJB Bean也分别被视为组件。
您将此私有名称空间主要用于 别名目的 。如果在“ ejb / PlaceBid”下映射某些内容,则所有(帮助程序)代码都可以使用“ ejb / PlaceBid”,并且在一个全局位置(本例中为servlet,但也可以是XML)可以确定精确映射的内容对它。如果所有代码都直接发送java:global/...到该名称,则可能会有数十个硬编码依赖项。
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")因此可以根据调用的组件返回不同的内容。
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中存储引用的名称:
java:comp/env/test.MyBean/myService
name
@Stateless public class MyBean { @EJB(name = "ejb/PlaceBid") private MyService myService; }
有点反常理,但是在大多数情况下,name此处的属性并不是指向要注入对象的 来源的 东西,而是在ENC中用作注入 目标的对象 。