ejb运行程序

在上一篇文章中,我们了解了EJB 引用和EJB 注入 。 尽管EJB注入是一种强大的容器工具,可以简化模块化应用程序的开发,但有时还是希望执行程序化EJB查找。

例如,让我们假设一组不同的EJB实现由公共业务接口定义的公共策略 。 根据某种选择算法(例如业务规则 )的结果,选择了不同的策略,因此将在业务流程的范围内执行不同的EJB。 在这种情况下,无法在注入时选择目标EJB,因为注释元素(例如@EJB的注释元素)是在编译时定义的,而部署描述符是在部署时定义的。 解决此问题的唯一方法是程序化 JNDI 查找

以前的帖子中描述的相同机制将适用。 EJB引用将使用@EJB批注或Java EE模块部署描述符的相应元素声明并链接到应用程序私有名称空间中的名称。

在应用程序专用命名空间中查找

在查询代码中使用的名称空间和目标EJB之间建立间接级别的可移植方法是使用应用程序专用名称空间。 这种间接级别在Java EE平台中非常普遍:不仅用于EJB引用,而且用于各种资源引用,例如JDBC数据源,JMS队列,JavaMail会话等。

对于EJB,如我们之前的文章所述,您只需定义一个私有名称,供应用程序的查找和注入代码使用。 这是一个专用的应用程序作用域名称,是java:comp / env JNDI条目的子元素。 借助@EJB批注和部署描述符,您可以在此名称和目标EJB之间建立链接。 唯一的区别是您的应用程序算法将选择适当的EJB并动态查找,而不是依赖容器将引用注入到您的组件中。

正如我们在已经看到部分2这一系列中,@EJB注释可以在类型,方法和字段级用于声明对EJB的引用,并且,任选地,而不需要写任何的将其链接到目标豆部署描述符代码。

如果是动态编程JNDI查找,则可以注释一个类(例如Servlet)以建立对EJB的引用,而不是将字段(或属性)注释为注入目标。 在下面的示例中,我们将看到如何同时使用@EJB注释和部署描述符。

声明对EJB的引用

在之前的文章中使用的测试servlet中,我们可以在类级别使用@EJB批注以私有名称ejb / ejbLocalRef声明对EJB的引用:

@EJB(name = "ejb/ejbLocalRef",beanInterface = es.reacts.SessionTest0Local.class,beanName = "EJBServer1.jar#SessionTest1")
public class ServletTest1 extends HttpServlet {[...]
}

上一个示例中的注释在功能上等效于以下部署描述符(在本例中为web.xml文件)片段:

<ejb-local-ref><ejb-ref-name>ejb/ejbLocalRef</ejb-ref-name><ejb-ref-type>Session</ejb-ref-type><local>es.reacts.SessionTest0Local</local><ejb-link>EJBServer1.jar#SessionTest1</ejb-link>
</ejb-local-ref>

此示例中的@EJB语义与上一篇文章中的示例之间的最重要区别是,在这种情况下,我们提供了建立引用和到目标EJB的链接所需的所有信息,而无需注入甚至不依赖有关来自注入目标的信息(例如beanInterface )。

尽管注释是在类级别应用的,但实际上等效于添加相应的部署描述符元素,因此, 声明的引用将在整个Java EE模块中可用 。 在这种情况下,您的Java EE Web模块中的任何其他servlet都将能够注入或查找ejb / ejbLocalRef名称所引用的相同EJB:

@EJB(name = "ejb/ejbLocalRef")
SessionTest0Local lc4;

由于引用声明包含解析目标EJB所需的所有信息,因此此处不需要额外的“管道”。

EJB程序化查找

由于已经声明并链接了引用,因此我们的代码现在可以进行JNDI查找,并检索对目标EJB所需业务接口的引用。 JNDI查找代码是我们习惯的良好的ole查找代码(稍有不同,我们将在后面指出):

InitialContext ctx = new InitialContext();
Object obj = ctx.lookup("java:comp/env/ejb/ejbLocalRef");
if (obj instanceof SessionTest0Local) {SessionTest0Local lc = (SessionTest0Local) obj;[...]
}

(* 请注意,先前的片段已删除了所需的异常处理代码 。)

EJB 3.0的一个好消息是,您无需按照EJB v。2.1规范的要求使用PortableRemoteObject.narrow()方法来缩小引用的范围。 在示例代码中,我们可以使用instanceof运算符直接测试引用,并使用Java本机强制转换设置SessionTest0Local引用。

查找本地和远程业务接口之间绝对没有区别。 仅在依赖部署描述符的情况下,才会根据EJB业务接口类型使用<ejb-ref>或<ejb-local-ref>执行EJB引用的声明和链接。 就您的应用程序而言,查找代码将相同。

模式

在不使用EJB注入而是依靠查找的情况下,使用注释或部署描述符声明和链接EJB引用既有优点也有缺点。

注释的优点在于,它们比相应的部署描述符元素更易于编写和使用。 而且,就我的经验而言,IDE对代码自动完成的支持可能比某些“晦涩”的部署描述符编辑器更好(最好是例外,例如Oracle JDeveloper和NetBeans)。

部署描述符的优点是它可以集中资源引用声明。 如果在您的Java EE模块的整个代码中都使用相同的EJB引用,并且不将其限制在单个类中,那么最好的选择是使用部署描述符声明和链接EJB(和其他资源)引用,并避免使用注释。 这是必须谨慎选择的设计选择。 在需要查找的用例中,很有可能在应用程序组装部署阶段执行EJB链接。 最好还是在中央存储库中对引用进行充分记录和声明,而不是在整个代码中散布@EJB注释,这样部署人员的工作可能会大大减轻。

参考: The Gray Blog上来自我们JCG合作伙伴 Gray的 EJB编程查找 。

相关文章 :
  • EJB 3.0注入和查找简介
  • 基本的EJB参考,注入和查找
  • 使用Oracle WebLogic对应用程序外部的EJB的引用
  • EJB 3.1全局JNDI访问
  • GWT EJB3 Maven JBoss 5.1集成教程
  • Java泛型快速教程
  • JVM如何处理锁

翻译自: https://www.javacodegeeks.com/2011/08/ejb-programmatic-lookup.html

ejb运行程序

ejb运行程序_EJB程序化查找相关推荐

  1. ejb运行程序_在哪里可以运行EJB?

    ejb运行程序 EJB不仅为Java EE应用服务器而建. 他们还可以执行在的Java EE Web Profile的容器或简单的Java SE环境(Java SE的啊- !E!ASY 的J ava ...

  2. 在linux中查找运行程序句柄,如何查找我的进程在Linux中打开的文件句柄?

    首先,您并不需要关心很多关于您不知道的打开的文件描述符.如果你知道你不会再写信给他们,关闭它们是一个好主意,并且不会伤害 - 毕竟你只是做了一个fork(),这个fds打开了两次.但是同样,如果你让他 ...

  3. sql注入查找注入点_基本的EJB参考,注入和查找

    sql注入查找注入点 在本系列的第一部分中 ,我们介绍了Enterprise JavaBeans v.3.0规范提供的机制,用于定义EJB组件,声明对EJB的引用并通过依赖项注入或程序化JNDI查找将 ...

  4. 基本的EJB参考,注入和查找

    在本系列的第一部分中 ,我们介绍了Enterprise JavaBeans v.3.0规范提供的机制,用于定义EJB组件,声明对EJB的引用并通过依赖项注入或程序化JNDI查找将它们连接起来. 在此博 ...

  5. EJB 3.0注入和查找简介

    介绍 Enterprise JavaBeans Specification v.3.0引入了简化的,基于注释的API,用于EJB注入和查找. EJB 3.0现在是POJO,可以使用简单的注释将其注入其 ...

  6. linux下软件编译终止,[2018年最新整理]linux下编译运行程序命令大全.ppt

    [2018年最新整理]linux下编译运行程序命令大全 1. 项目课题引入 2. Vi编辑器的使用方法 3. Linux中C语言程序的编辑 4. Linux中C语言程序的运行 5. 现场演示案例 课题 ...

  7. 在Red Hat Linux中自动运行程序

    在Red Hat Linux中自动运行程序 1.开机启动时自动运行程序 Linux加载后, 它将初始化硬件和设备驱动, 然后运行第一个进程init.init根据配置文件继续引导过程,启动其它进程.通常 ...

  8. mac使用codelite运行程序没有输出

    这几天用mac做了些开发,装了一个CodeLite做C++开发,结果运行程序后,虽然启动了两个终端窗口,但是并没有程序的输出 IDE中报错xcrun: error: invalid active de ...

  9. red hat linux怎么运行,Red Hat Linux中自动运行程序

    1.开机启动时自动运行程序 Linux加载后, 它将初始化硬件和设备驱动, 然后运行第一个进程init.init根据配置文件继续引导过程,启动其它进程.通常情况下,修改放置在 /etc/rc或 /et ...

最新文章

  1. 深入浅出统计学(十一)总体和样本的估计
  2. signature=a8a3e788013f73439051c7287d7f5f0b,来用百度密语吧!!!
  3. 伪造服务钓鱼工具Ghost Phisher
  4. 【HAOI2014】走出金字塔
  5. ajax返回显示下拉列表,ajax中网页传输(二)JSON——下拉列表显示练习(示例代码)...
  6. MW150UH驱动程序Linux,水星MW150UH无线网卡驱动
  7. 一次利用位图索引进行SQL优化的案例
  8. JAVA通过反射获取方法真实参数名
  9. Java web小项目_个人主页(1)—— 云环境搭建与项目部署
  10. 阿里云天池 Python训练营Task3: Python基础进阶:从函数到高级魔法方法 学习笔记
  11. 史上最强Dubbo面试28题答案详解:核心功能+服务治理+架构设计等
  12. chosen jquery ajax搜索,基于chosen插件实现人员选择树搜索自动筛选功能
  13. npm 依赖下载报错 Hostname/IP does not match certificate‘s 相关 解决方案
  14. ttc文件linux安装,Linux当中如何安装字体?
  15. magic4.0跟harmonyos,支持升级Harmony 2.0 Magic UI 4.0 9月中旬招募公测
  16. Python自动化办公【PDF文件自动化】
  17. arm linux关机命令,嵌入式Linux的关闭命令是什么?
  18. Java计算两个时间的月份差值
  19. 阿里云播放器SDK的正确打开方式 | Aliplayer Web播放器介绍及功能实现(三)
  20. Apereo CAS 4.1 反序列化命令执行漏洞复现

热门文章

  1. 用python画出吉祥物
  2. react-redux模型图
  3. 81. 搜索旋转排序数组 II---Leecode----java
  4. 2017蓝桥杯省赛---java---B---1(购物单)
  5. JSON 和 JavaScript 对象互转
  6. php处理j数组,PHP Bean 类处理 数组处理
  7. 用计算机控制英文,计算机控制
  8. 图论——Dijkstra+prim算法涉及到的优先队列(二叉堆)
  9. //rest风格写_REST /使用提要发布事件
  10. apache ignite_Apache Ignite本机持久性,简要概述