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.pswp.cn/news/374583.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/374583.shtml
英文地址,請注明出處:http://en.pswp.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 甚…