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

Onu*_*nur 3 java jndi java-ee ejb-3.0

是否有任何情况(鉴于Java EE6具有java:global /,app /,模块/命名标准),需要声明EJB或资源,如下例所示?

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

}
Run Code Online (Sandbox Code Playgroud)

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

PlaceBid placeBid = (PlaceBid)context.lookup("java:comp/env/ejb/PlaceBid");
Run Code Online (Sandbox Code Playgroud)

Arj*_*jms 18

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

它就像是与每个组件关联的私有"hashmap",整个Web模块被视为一个组件,而各个EJB bean也是组件.

您使用此私有命名空间主要用于别名.如果您在"ejb/PlaceBid"下映射某些内容,那么所有(辅助)代码都可以使用"ejb/PlaceBid"并在一个全局位置(在这种情况下是servlet,但它也可以是XML),您可以确定完全映射的内容它.如果所有代码都直接进入,java:global/...则可能存在数十个与此名称相关的硬编码依赖项.

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


其他一些注意事项:

1.使用EJB SessionContext,您可以直接引用此命名空间,如下所示:

PlaceBid placeBid = (PlaceBid)sessionContext.lookup("ejb/PlaceBid");
Run Code Online (Sandbox Code Playgroud)

这里"ejb/PlaceBid"是ENC的相对名称.

2.如前所述,ENC对每个组件都是私有的.不同的EJB可以以不同方式映射给定的相对名称.context.lookup("java:comp/env/ejb/PlaceBid")因此可以根据您拨打电话的组件返回不同的内容.

从历史上看,ENC早于我们现在称之为注射的东西.在某种程度上,当您在XML中指定映射时,您将"注入"某个与该组件关联的私有"hashmap".现代版本注入字段,构造函数或属性(setter),但旧版本注入"keys".

即使在EJB3.1中,历史上的"注入"机制仍然处于活跃状态.如果在字段上使用@EJB执行看似正常的注入,那么这也会自动在JNDI ENC中创建一个条目.例如

package test;

@Stateless
public class MyBean {

   @EJB
   private MyService myService;

}
Run Code Online (Sandbox Code Playgroud)

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

@Stateless
public class MyBean {

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

}
Run Code Online (Sandbox Code Playgroud)

有点反直觉,但在大多数情况下,name这里的属性不是指向要注入的对象的源的东西,而是用作注入的ENC中的目标.