当前位置: 首页 > 面试题库 >

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

柳涵映
2023-03-14
问题内容

仍然存在任何情况(鉴于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");

问题答案:

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中用作注入 目标的对象



 类似资料:
  • 我正在研究一个场景,其中有多个父类别,每个父类别都有多个子类别。 我已经设置了父类别来显示子类别,而不是产品。 下面是我当前的层次结构: 父类别1 子类别1 子类别2 子类别3 父类别2 子类别4 一切都很好,但我想做一件额外的事情,显示所有子类别的描述,当它们显示在父类别下。 我知道子类别的标题在查看父类别时默认显示,但是,我找不到一种方法来覆盖默认循环以显示父类别中子类别的描述。 任何帮助都将

  • 我目前正在开发一个api级别在21-29之间的android应用程序。我的问题是api级别29以下不支持某些权限。例如权限不需要声明api级别29以下。当我定义这个权限并获取所有权限,然后要求用户授予权限时,低于api级别29的应用程序正在崩溃。我需要为不同的api级别定义不同的权限或者如何处理这个问题? 下面是我的manifest.xml 这是我获得所有权限的代码

  • 在TypeScript中,当创建.d.ts源代码声明文件时,哪个更可取,为什么? 或 我能说出的区别是接口不能有静态方法,所以你必须为此使用一个类。两者都不产生任何JS输出,所以也许没关系?

  • 问题内容: 让我们看看Linux()中的功能: 让我们看看Mac()中的功能: 如您所见,这些声明彼此不同(参数顺序)。这真是令人惊讶!在某个地方抱怨解决这个问题是否有效? 问题答案: 在某个地方抱怨解决这个问题是否有效? las,不。这种方式已经存在了很长时间,并且有太多的代码依赖于此。 我认为根本的问题是“ 为什么会发生这些不兼容 ”?我会回答。它似乎可以归结为BSD首先实现它,但界面较差。I

  • 问题内容: Java7的try-with-resources非常好,但是我无法绕开为什么需要在语句中包括资源声明的问题。我的直觉说以下应该是可能的: las,这会导致语法错误(含糊地期待a )。将类型定义/声明移动到语句中是可行的,这当然会将事物移动到相应的范围内。当我想从封闭中获得更多收益时,我可以弄清楚该如何解决,我对 为什么 编译器需要这样的东西很感兴趣。 问题答案: 您的版本未明确定义应关

  • 问题内容: “ Prepared Statement”是Statement的稍强版本,并且应始终至少与Statement一样快捷且易于处理。 准备好的语句可能已参数化 大多数关系数据库通过四个步骤来处理JDBC / SQL查询: 解析传入的SQL查询 编译SQL查询 规划/优化数据采集路径 执行优化的查询/获取并返回数据 对于发送到数据库的每个SQL查询,一个Statement将始终执行上述四个步