基本的EJB參考,注入和查找

在本系列的第一部分中 ,我們介紹了Enterprise JavaBeans v。3.0規范提供的機制,用于定義EJB組件,聲明對EJB的引用并通過依賴項注入或程序化JNDI查找將它們連接起來。

在此博客文章中,我們將研究一些基本示例以了解如何使用EJB API。

基本EJB

EJB本質上是帶有一些額外EJB元數據的POJO。 可以通過使用EJB批注或通過標準部署描述符來提供將其部署為EJB組件所需的元數據。 以下類實現了一個非常基本的無狀態會話EJB:

package es.reacts;import javax.ejb.Stateless;@Stateless(name = "UniqueLocalSessionEJB")
public class UniqueLocalSessionEJBBean implements UniqueLocalBusinessInterface {public UniqueLocalSessionEJBBean() {}public String sayLocalHello() {return this.getClass().getName() + "::" + "Local hello.";}
}

正如您可能從我們以前的博客文章中所回顧的那樣, @Stateless批注用于定義無狀態會話bean。 可選的name元素用于定義會話bean 名稱 。 該元素類似于標準部署描述符的<ejb-name />元素。 此元素默認為bean類(UniqueLocalSessionEJBBean在上面的例子中),和上述使用它的示例的非限定名稱重新命名bean來UniqueLocalSessionEJB。

由于我們使用@Stateless批注,因此不再需要在部署描述符中聲明EJB。

在此示例中,我們假設EJB打包在EJB模塊中,該模塊取決于包含其業務接口定義的模塊(如以下部分所述)。

業務接口

每個EJB都實現一個或多個業務接口。 業務接口可以是本地遠程的 。 兩種類型的業務接口之間最重要的區別可以歸納如下:

  • 本地業務接口對其方法使用按引用傳遞語義,并且方法調用不能跨越JVM邊界。 本地業務接口僅對被調用方的相同應用程序和JVM實例中的調用方可用。
  • 遠程業務接口對其方法使用按值傳遞語義,并且方法調用可以跨越JVM邊界。 遠程業務接口可用于被呼叫者應用程序之外的呼叫者。

在前面的示例中,業務接口UniqueLocalBusinessInterface聲明如下:

package es.reacts;import javax.ejb.Local;@Local
public interface UniqueLocalBusinessInterface {String sayLocalHello();
}

在EJB v。3.0世界中,業務接口只是用@Local@Remote批注進行批注的普通Java接口。

包裝業務接口

在此示例中,我們假設EJB業務接口打包在EJB模塊依賴的JAR文件中。 由于EJB客戶端僅依賴EJB業務接口,因此,將業務接口打包在一個單獨的庫中是一個好習慣,以簡化接口分配并使它們與實現分離。

將EJB注入Java Servlet

既然我們已經定義了EJB,就可以在Java EE Web模塊中的servlet中使用它了。 假設在我們的應用程序中只有一個EJB實現了UniqueLocalBusinessInterface ,我們可以使用空的@EJB注釋將其注入:

package es.reacts;import java.io.IOException;
import java.io.PrintWriter;import javax.ejb.EJB;import javax.servlet.*;
import javax.servlet.http.*;public class ServletTest1 extends HttpServlet {@EJBUniqueLocalBusinessInterface lc;public void doGet(HttpServletRequest request,HttpServletResponse response)throws ServletException, IOException {[...]lc.sayLocalHello();[...]}

首先要注意的是,由于僅bean接口就足以識別目標EJB,因此應用服務器將EJB注入了EJB。 在這種情況下,@EJB批注的beanInterface元件取它的默認值,因為在我們解釋之前的帖子 UniqueLocalBusinessInterface:,那是注入字段的類型。 由于應用程序中只有一個EJB可以實現此業務接口,因此servlet的lc字段將注入對此類實例的引用。

值得指出的第二件事是,由于EJB是無狀態的 ,因此我們正在將EJB安全地注入到servlet字段中。 由于servlet的默認情況下無狀態的 ,你應該注射狀態的資源轉換成Servlet時域特性,否則你可能會碰到并發相關的問題。 如果需要在Servlet中使用有狀態EJB,則應通過程序化JNDI查找來檢索引用,因為這將確保每次查找操作都返回一個新實例。

讓我們部署并運行我們的應用程序,我們將看到servlet注入了它的目標EJB,并且正確執行了對其業務接口的sayLocalHello()方法的方法調用。

如果我們想注入對遠程接口的引用,則客戶端代碼不會受到影響。 如果嘗試將UniqueLocalBusinessInterface@Local更改為@Remote ,那么您會看到該servlet沒有任何變化,并且可以繼續正常工作。

如果一個以上的EJB實現相同的接口會發生什么?

假設我們在此應用程序的EJB模塊中添加了另一個EJB,它實現了與上一個相同的接口UniqueLocalBusinessInterface 。 在這種情況下,由于bean接口不再足以確定要注入的目標bean,因此將返回一個錯誤。 例如,在WebLogic Application Server中部署這樣的應用程序會導致引發以下錯誤:

[08:46:25 PM] Caused by: weblogic.deployment.EnvironmentException: [J2EE:160199]Error resolving ejb-ref 'es.reacts.ServletTest1/lc1' from module 'WebTest0' of application 'EJBTestApp'. The ejb-ref does not have an ejb-link and the JNDI name of the target bean has not been specified. Attempts to automatically link the ejb-ref to its target bean failed because multiple EJBs in the application were found to implement the 'es.reacts.UniqueLocalBusinessInterface' interface. Please specify a qualified ejb-link for this ejb-ref to indicate which EJB is the target of this ejb-ref.

注入對特定EJB實例的引用

為了解決上一節中出現的問題,我們需要為應用程序服務器提供所需的信息,以標識目標EJB。 如前一篇文章所述 ,我們可以使用以下兩種方法:

  • 我們可以使用@EJB批注的name元素(或部署描述符的相應<ejb-ref-name />元素)在應用程序的私有名稱空間中聲明EJB引用,然后使用EJB鏈接到目標bean。部署描述符。
  • 或者,我們使用@EJB批注的beanName元素(或部署描述符的相應<ejb-link />元素)直接在我們的代碼中進行操作。

將EJB映射到私有命名空間

使用第一種方法,我們將在servlet中獲得以下代碼:

@EJB(name = "ejb/bean-name")
UniqueLocalBusinessInterface lc;

以及充當EJB客戶端的Java EE Web模塊的部署描述符(web.xml)中的以下元素:

<ejb-local-ref><ejb-ref-name>ejb/bean-name</ejb-ref-name><ejb-ref-type>Session</ejb-ref-type><local>es.reacts.UniqueLocalBusinessInterface</local><ejb-link>UniqueLocalSessionEJB</ejb-link>
</ejb-local-ref>

<ejb-link />元素包含我們在示例開頭定義的帶注釋的Bean名稱:

@Stateless(name = "UniqueLocalSessionEJB")

在EJB實現類中。

請注意,在此示例中,我們顯式使用了@EJB name元素,但是我們可以使用其默認值來建立鏈接。 name元素的默認值為:

[合格的類名稱] / [屬性或字段名稱]

在這種情況下,將是:

es.reacts.ServletTest1 / lc

使用默認的自動生成的名稱以及使用<ejb-link />進行EJB鏈接的缺點是,每次重構代碼時,都必須檢查部署描述符。 盡管開發人員有時會另外考慮,但Java EE規范定義了一些其他角色,例如,攻擊者和部署者。 在大型公司環境中,此類概要文件會覆蓋開發人員的注釋以“插入”應用程序使用的組件并不少見。 注釋覆蓋是標準部署描述符仍然存在的原因之一。 當引用是在應用程序內部或外部的遠程組件時,尤其如此。 為此,我建議你不要依賴于自動生成的名稱,并使用自定義的有據可查的名稱代替。

將EJB鏈接到私有命名空間中的引用

第二種方法提供了使用@EJB批注的beanName元素將引用鏈接到其目標bean的直接方法。 Servlet代碼將使用以下EJB參考:

@EJB(beanName = "UniqueLocalSessionEJB")
UniqueLocalBusinessInterface lc;

并且我們不需要部署描述符中的其他信息。

盡管此方法允許開發人員在不依賴部署描述符的情況下將引用鏈接到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/basic-ejb-references-injection-and.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/374785.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/374785.shtml
英文地址,請注明出處:http://en.pswp.cn/news/374785.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ViewPager使用筆記

1.ViewPager.setCurrentItem(position)&#xff0c;即使已設置動畫&#xff0c;但是沒有動畫效果 原因&#xff1a;因為ViewPager滑動之前的時間間隔太短&#xff0c;可以通過反射&#xff0c;去修改ViewPager自動滑動時間&#xff0c;代碼實現如下 1 public class ViewPagerSc…

IOS開發之Swift學習筆記

1.因為存儲屬性要求初始化&#xff0c;我們可以使用lazy修飾符來延遲初始化。轉載于:https://www.cnblogs.com/luntai/p/5430223.html

力扣1兩數之和

給定一個整數數組 nums 和一個整數目標值 target&#xff0c;請你在該數組中找出 和為目標值 target 的那 兩個 整數&#xff0c;并返回它們的數組下標。 你可以假設每種輸入只會對應一個答案。但是&#xff0c;數組中同一個元素在答案里不能重復出現。 你可以按任意順序返回…

C ++或Java,高頻交易哪個更快?

總覽 關于什么是高頻交易的最佳解決方案&#xff0c;存在不同意見。 問題的一部分是高頻交易的變化超出您的預期&#xff0c;另一部分是更快的含義。 我的看法 如果您有一個典型的Java程序員和一個典型的C 程序員&#xff0c;并且每個人都有幾年編寫典型的面向對象程序的經驗…

iOS 8 Xcode6 設置Launch Image 啟動圖片

本人apem http://www.mamicode.com/info-detail-494411.html 如何設置App的啟動圖,也就是Launch Image? Step1 1.點擊Image.xcassets 進入圖片管理,然后右擊,彈出"New Launch Image"2.如圖,右側的勾選可以讓你選擇是否要對ipad,橫屏,豎屏,以及低版本的ios系統做支持…

代碼分享h5-sessionStorage,提示app下載代碼塊

1.html <div class"down-app">    <span id"dowm-close">x</span>    <dl>      <dt>logo</dt>      <dd>        <h3>某某公司</h3>        <p>某某公…

Apache CXF負載平衡和故障轉移

前一段時間&#xff0c;我們已經面臨基于Apache CXF的負載平衡Web服務客戶端的需求。 此外&#xff0c;當某些服務器關閉時&#xff0c;客戶端應自動進行故障轉移。 更糟糕的是&#xff0c;服務器目標地址列表要從外部服務獲取并在運行時更新。 最終&#xff0c;我們最終獲得了…

Java局部變量一定要賦初值

根據大佬文章https://blog.csdn.net/wjw521wjw521/article/details/79243596的理解而寫的 1.類成員變量在 類加載 時會被系統賦初值&#xff0c;比如定義一個整型變量int num 系統默認num值為0 2.但是方法內的局部變量執行進棧操作&#xff0c;這個過程中系統不會賦初值&…

隱式的類類型轉換

如果構造函數只接受一個實參&#xff0c;則它實際上定義了轉換為此類類型的隱式轉換機制。將這種構造函數稱為轉換構造函數。 #ifndef MAIN_H_INCLUDED#define MAIN_H_INCLUDED#include<iostream>usingnamespace std;classClassTest{public:ClassTest(){ cout <<&q…

負數的 %求余和取模

1.求余和取模是不同的 2.‘%’ 在C/C&#xff0c;Java等語言中意為 求余 &#xff0c;在python 中意為 取模 3.a%b c 求余: c的符號和a一致 取模&#xff1a;c的符號和b一致 比如&#xff0c;一個小李子&#xff1a; public class Solution{public static void main(String…

PAT-BASIC-1038-統計同成績學生

本題要求讀入N名學生的成績&#xff0c;將獲得某一給定分數的學生人數輸出。 輸入格式&#xff1a; 輸入在第1行給出不超過105的正整數N&#xff0c;即學生總人數。隨后1行給出N名學生的百分制整數成績&#xff0c;中間以空格分隔。最后1行給出要查詢的分數個數K&#xff08;不…

JavaScript事件處理的三種方式(轉)

一、什么是JavaScript事件&#xff1f;事件(Event)是JavaScript應用跳動的心臟&#xff0c;也是把所有東西粘在一起的膠水&#xff0c;當我們與瀏覽器中Web頁面進行某些類型的交互時&#xff0c;事件就發生了。 事件可能是用戶在某些內容上的點擊、鼠標經過某個特定元素或按下鍵…

Erlang與Java內存架構

我讀了一篇關于Erlang VM的內存管理策略的非常非常有趣的文章。 它是Jesper Wilhelmsson撰寫的論文 &#xff0c;我認為討論Erlang的內存設置和Oracle的Java VM之間的差異可能會很好。 作為對從未聽說過Erlang的人的真正的簡短介紹; 它是一種功能語言&#xff0c;使用異步消息傳…

Xuggler教程:轉碼和媒體修改

注意&#xff1a;這是我們的“ Xuggler開發教程 ”系列的一部分。 在之前的教程中&#xff0c;我對視頻處理Xuggler進行了簡短介紹 。 在這一部分中&#xff0c;我們將看到Xuggler和FFmpeg提供的一些更令人興奮的功能&#xff0c;例如視頻轉碼和媒體修改。 不要忘記Xuggler是一…

Web工程師必備的43款可視化工具

國外站點DATAVISUALIZATION.CH為大家總結出了當前熱用的43款可視化工具&#xff0c;包括Arbor、Chroma.js、D3.js、Google Chart Tools等&#xff0c;絕對讓你一飽眼福。 1.Arbor.js Arbor是一個免費的、可視化的圖形庫&#xff0c;基于矢量創建動態的連接圖。它為圖形組織和屏…

力扣7. 整數反轉

方法一&#xff1a;官方給的&#xff0c;自己懂了后照著敲了一遍 class Solution {public int reverse(int x) {int rev 0;while (x ! 0) {//if判斷條件過于復雜&#xff0c;我好不容易看懂了if (rev < Integer.MIN_VALUE / 10 || rev > Integer.MAX_VALUE / 10) {retu…

AndroidManifest.xml中的application中的name屬性

被這個不起眼的屬性折磨了一天&#xff0c;終于解決了。 由于項目需要&#xff0c;要合并兩個android應用&#xff0c;于是拷代碼&#xff0c;拷布局文件&#xff0c;拷values&#xff0c;所有的都搞定之后程序還是頻頻崩潰&#xff0c;一直沒有找到原因&#xff0c;學android…

完美單身

我不時遇到一些Java程序員&#xff0c;他們不確定他們應該如何正確實現Singleton模式。 &#xff08;如果您不知道什么是Singleton&#xff0c;請嘗試Wikipedia&#xff1a; Singleton模式 &#xff09;。 我并不是在談論在線程環境中的正確實現。 但是&#xff0c;使用最常見的…

力扣移動零

給定一個數組 nums&#xff0c;編寫一個函數將所有 0 移動到數組的末尾&#xff0c;同時保持非零元素的相對順序。 我寫的代碼思路是從開始元素找0&#xff0c;找到了就將這個0后面的元素向前移一位 class Solution {public void moveZeroes(int[] nums) {int n nums.length;…

Doclava:來自Google的自定義Javadoc Doclet

Doclava是Google的自定義Javadoc Doclet&#xff0c;由Google Guice使用&#xff08;請參閱稍冷的 Javadocs &#xff09;。 Doclava使用JSilver作為其模板引擎&#xff0c;這是Clearsilver的純Java實現。 我個人喜歡聯合文檔的想法&#xff0c;它允許文檔在打開的項目上相互鏈…