EJB程序化查找

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

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

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

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

在查询代码中使用的名称空间和目标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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/374583.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

git克隆/更新/提交代码步骤及示意图

1. git clone ssh://flycm.intel.com/scm/at/atSrc 或者git clone ssh://flycm.intel.com/scm/at/atJar 或者git clone ssh://flycm.intel.com/scm/at/atFramework 2. git checkout cpeg/scm/stable 切换分支&#xff0c;然后更新代码 3. git pull 先把远程分支上最新的代码拉到…

C++面试宝典

1.new、delete、malloc、free关系 delete会调用对象的析构函数,和new对应free只会释放内存&#xff0c;new调用构造函数。malloc与free是C/C语言的标准库函数&#xff0c;new/delete是C的运算符。它们都可用于申请动态内存和释放内存。对于非内部数据类型的对象而言&#xff0c…

Google App Engine:在您自己的域中托管应用程序

在Google App Engine中创建新应用程序时&#xff0c;您将获得一个域名“ yourapp.appspot.com”。 但是&#xff0c;谁会想要以这样的后缀托管他们的应用程序&#xff08;除非您喜欢它&#xff01;&#xff09;&#xff1f; 为了改善您的应用品牌&#xff0c;最好的办法是将您的…

从零开始学 iOS 开发的15条建议

事情困难是事实&#xff0c;再困难的事还是要每天努力去做是更大的事实。 因为我是一路自学过来的&#xff0c;并且公认没什么天赋的前提下&#xff0c;进步得不算太慢&#xff0c;所以有很多打算从零开始的朋友会问我&#xff0c;该怎么学iOS开发。跟粉丝群的朋友交流了一下&a…

垂直居中-父元素高度确定的多行文本(方法二)

除了上一节讲到的插入table标签&#xff0c;可以使父元素高度确定的多行文本垂直居中之外&#xff0c;本节介绍另外一种实现这种效果的方法。但这种方法兼容性比较差&#xff0c;只是提供大家学习参考。 在 chrome、firefox 及 IE8 以上的浏览器下可以设置块级元素的 display 为…

13. 罗马数字转整数

罗马数字转整数 class Solution {public int romanToInt(String s) {Map<Character,Integer> map new HashMap<Character,Integer>(){{put(I,1);put(V,5);put(X,10);put(L,50);put(C,100);put(D,500);put(M,1000);}};int res 0;for(int i 0;i<s.length();i)…

互联网金融P2P主业务场景自动化测试

互联网金融P2P行业&#xff0c;近三年来发展迅速&#xff0c;如火如荼。据不完全统计&#xff0c;全国有3000的企业。“互联网”企业&#xff0c;几乎每天都会碰到一些奇奇怪怪的bug&#xff0c;作为在互联网企业工作的测试人员&#xff0c;风险和压力都巨大。那么我们如何降低…

OSGi将Maven与Equinox结合使用

很长时间以来&#xff0c;我一直在努力理解OSGi的真正含义。 它已经存在很长时间了&#xff0c;但是没有多少人意识到这一点。 人们已经大肆宣传它是一种非常复杂的技术。 这是我为所有Java开发人员简化的尝试。 简而言之&#xff0c; OSGi是一组规范&#xff0c;这些规范允许对…

note05-计算机网络

5.网络安全 被动攻击(UDP报文被截获 被 进行流量分析) 主动攻击 1.篡改(更改报文流 伪报文) 2.恶意程序(病毒、木马、蠕虫、炸弹) 3.拒绝服务Dos 密码体制 1.对称密钥密码体制(DES IDEA) 即加密和解密的密钥K相同 2.公钥密码体制(RSA) A加密使用PKB公钥 B解密使用对应的私钥SK…

825. 适龄的朋友

适龄的朋友 在社交媒体网站上有 n 个用户。给你一个整数数组 ages &#xff0c;其中 ages[i] 是第 i 个用户的年龄。 如果下述任意一个条件为真&#xff0c;那么用户 x 将不会向用户 y&#xff08;x ! y&#xff09;发送好友请求&#xff1a; age[y] < 0.5 * age[x] 7 ag…

struts2设置文件上传大小

利用struts2想要设置或者限制上传文件的大小,可以在struts.xml配置文件里面进行如下配置: <constant name"struts.multipart.maxSize" value"10000000" /> 上面这句话的意思是设置文件上传大小&#xff0c;最大不超过9.8M。计算方式如下&#xff1a;…

Java命名约定

我想写这篇简短的文章来帮助某些难以记住Java API类和方法名称的人。 如您所知&#xff0c;Java是区分大小写的语言&#xff0c;要构建Java程序&#xff0c;您需要使用许多内置API类和方法。 而且&#xff0c;初学者发现很难准确地记住方法名称和类名称而不改变大小写。 但是实…

smarty引擎之练习

关于smarty最直观的感受就是分离了页面中html和php的代码&#xff0c;页面不再混乱&#xff0c;很清晰了…… smarty->assign();//注册 smarty->display();//加载模板 除了老师给的表&#xff0c;kemu,nandu,type都建了表格&#xff0c;便于使用 main.php <?phpinclu…

Heron 论文翻译及理解

Heron 论文翻译及理解 背景介绍&#xff1a; Heron是号称Twitter流数据处理的新一代实现&#xff0c;是StormV2。我们首先回顾一下Storm系统的问题 worker日志混乱&#xff0c;如果一个bolt日志过大&#xff0c;会冲掉其他bolt的日志worker之间因为没有资源隔离&#xff0c;因此…

1688比赛中的配对次数

给你一个整数 n &#xff0c;表示比赛中的队伍数。比赛遵循一种独特的赛制&#xff1a; 如果当前队伍数是 偶数 &#xff0c;那么每支队伍都会与另一支队伍配对。总共进行 n / 2 场比赛&#xff0c;且产生 n / 2 支队伍进入下一轮。 如果当前队伍数为 奇数 &#xff0c;那么将…

Hadoop:简单介绍

什么是Hadoop&#xff1a; Hadoop是一种用Java编写的框架&#xff0c;用于在大型商品硬件集群上运行应用程序&#xff0c;并具有类似于Google File System和MapReduce的功能 。 HDFS是高度容错的分布式文件系统&#xff0c;与Hadoop一样&#xff0c;旨在部署在低成本硬件上。 它…

PHP中__get()和__set()的用法实例详

刚刚看到一个对我有用的文章&#xff0c;我就把它摘抄下来了。 php面向对象_get(),_set()的用法 一般来说&#xff0c;总是把类的属性定义为private&#xff0c;这更符合现实的逻辑。但是&#xff0c;对属性的读取和赋值操作是非常频繁的&#xff0c;因此在PHP5中&#xff0…

Javascript 异步编程的4种方法

你可能知道&#xff0c;Javascript语言的执行环境是"单线程"&#xff08;single thread&#xff09;。 所谓"单线程"&#xff0c;就是指一次只能完成一件任务。如果有多个任务&#xff0c;就必须排队&#xff0c;前面一个任务完成&#xff0c;再执行后面一…

力扣奇偶链表

给定单链表的头节点 head &#xff0c;将所有索引为奇数的节点和索引为偶数的节点分别组合在一起&#xff0c;然后返回重新排序的列表。 第一个节点的索引被认为是 奇数 &#xff0c; 第二个节点的索引为 偶数 &#xff0c;以此类推。 请注意&#xff0c;偶数组和奇数组内部的…

JAVA入门之方法

所谓方法&#xff0c;就是用来解决一类问题的代码的有序组合&#xff0c;是一个功能模块。 一般情况下&#xff0c;定义一个方法的语法是&#xff1a; 其中&#xff1a; 1、 访问修饰符&#xff1a;方法允许被访问的权限范围&#xff0c; 可以是 public、protected、private 甚…