国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

EJB是如何封裝事務(wù)邏輯的?

2019-11-18 12:35:38
字體:
供稿:網(wǎng)友

  J2EE平臺包含了一個針對分布組件模型的規(guī)范,這個模型叫做企業(yè)javaBeans(EJB)。假如你已經(jīng)利用Java工作了一段時間,你就可能對EJB及其同事務(wù)邏輯之間的關(guān)系有一些基本的了解。在本文中,我們會更加深入地看探討,如何在同其他資源進行交互操作的同時使用EJB來封裝事務(wù)邏輯。關(guān)于如何使用EJB創(chuàng)建事務(wù)邏輯組件的一些背景知識,可以參看我 先前的文章 。你可以在這里下載到本文所涉及的 示例代碼 。
  
  
  
  層的范圍
  
   
  
  我們對中間件概念的探討要從包含有一個客戶層和三個服務(wù)器層的結(jié)構(gòu)開始。這三個服務(wù)器層是下面這些:
  
  表示層——負責(zé)接收客戶請求,把這些請求分發(fā)給事務(wù)邏輯組件,然后把回應(yīng)進行格式化,以便傳送回客戶端。
  事務(wù)層——負責(zé)接受來自表示層的服務(wù)請求,訪問數(shù)據(jù)資源以及其他企業(yè)系統(tǒng),再將結(jié)果數(shù)據(jù)返回給表示層。
  數(shù)據(jù)層——數(shù)據(jù)資源和外部企業(yè)系統(tǒng)的訪問點。
  
  我們把JavaBeans用作數(shù)據(jù)對象使用,這樣就能在服務(wù)器層之間傳遞數(shù)據(jù)。圖A說明了這些概念和組件。
  
  圖A
   EJB是如何封裝事務(wù)邏輯的?(圖一)
  組件模型和EJB
  
  軟件組件有一些很顯著的特點:
  
  自主性——軟件組件應(yīng)該能夠不依靠于其他組件或者應(yīng)用程序而獨立工作。
  動態(tài)可發(fā)現(xiàn)性——盡管一個軟件組件在桌面環(huán)境下可能不需要被動態(tài)發(fā)現(xiàn),但是在分布系統(tǒng)的環(huán)境下,最好具有這個特性。
  事務(wù)進程——軟件組件應(yīng)該能夠邏輯事務(wù)的進程。
  包含對外公開的接口——軟件組件應(yīng)該公開一個或者多個接口,用于向外提供對這個組件功能的訪問。
  能夠用于創(chuàng)建其他的組件或者應(yīng)用程序——軟件組件的主要任務(wù)是讓開發(fā)人員能夠把一個或多個組件同自定義的應(yīng)用程序或者系統(tǒng)代碼結(jié)合起來,從而創(chuàng)建其他的組件或者應(yīng)用程序。
  
  為了說明組件可以如何被用來創(chuàng)建一個更加復(fù)雜的實體,我們可以把軟件的組件比作汽車的零部件,汽車的每個零部件(組件)都有其專用的作用(進程)。只要零部件的位置準確且電纜連接正確(接口),它就能夠被作為整車(其他組件或者應(yīng)用程序)的一個組成部分。
  EJB是如何封裝事務(wù)邏輯的?(圖二)
  作為事務(wù)邏輯組件的EJB
  
   
  
  EJB組件模型具有我們?yōu)檐浖M件所制定的絕大多數(shù)特點:
  
  自主性——EJB能夠不依靠于其他組件或者應(yīng)用程序而獨立完成其工作。但是EJB必須在EJB容器內(nèi)執(zhí)行。
  動態(tài)可發(fā)現(xiàn)性——EJB使用JNDI來定位主接口、事務(wù)方法和元數(shù)據(jù)。
  事務(wù)進程——EJB組件從定義上講就是被封裝的事務(wù)進程。
  包含由對外公開的接口——EJB使用Java接口來指定其事務(wù)方法。
  能夠用于創(chuàng)建其他的組件或者應(yīng)用程序——就和基本的軟件組件一樣,EJB能夠被集中起來完成更加復(fù)雜的功能。
  
  EJB組件模型還加入了許多重要的組件模型特性,這些特性讓其成為更能夠吸引人的中間件,例如事務(wù)處理、安全和數(shù)據(jù)庫的連接性。
  
  事務(wù)處理點和數(shù)據(jù)訪問點經(jīng)常形成分布系統(tǒng)事務(wù)邏輯組件的表面。這些方面讓EJB成為了一個用于中間件事務(wù)邏輯組件的好技術(shù)。
  
  EJB和POJO
  
  當對事務(wù)邏輯的訪問跨越物理邊界或者跨越JVM邊界的時侯,按傳統(tǒng)習(xí)慣EJB就會被調(diào)用;而這是遠程過程的調(diào)用就會起作用。但是,EJB規(guī)范引入了本地接口,所以EJB提供了一個更加簡便的方式把同一個JVM里位于同一個物理層的對象和組件公開了事務(wù)邏輯。
  
  使用遠程或者本地接口訪問EJB組件的靈活性使得很多結(jié)構(gòu)成為可能。例如,根據(jù)事務(wù)的需要,我們可以從表示層遠程調(diào)用EJB,或者是從本地事務(wù)層的其他plain-old Java對象(POJO),如圖B所示。
  
  圖B
  EJB是如何封裝事務(wù)邏輯的?(圖二)
  EJB訪問的靈活性讓你能夠運用合成原理利用多個JavaBeans和一個或者多個POJO創(chuàng)建邏輯組件。讓我們看一個簡單的EJB應(yīng)用程序吧,這個程序用一個事務(wù)方法公開了一個用戶帳號。JavaBean這個賬號的遠程接口看起來會像Listing A里的一樣。那么事務(wù)邏輯類就會看起來像Listing B里的一樣。最后,客戶端的代碼會像Listing C里的這樣。
  Listing A
  
  
  public interface Account extends javax.ejb.EJBObject, java.rmi.Remote {  public String getBalance() throws java.rmi.RemoteException; } Our home interface might look something like the following: public interface AccountHome extends javax.ejb.EJBHome {  public Account create() throws javax.ejb.CreateException,                 java.rmi.RemoteException; }
  
  
  Listing B
  
  
  public class AccountBean  implements javax.ejb.sessionBean {  PRivate javax.ejb.SessionContext ctx;  public void ejbActivate() {}  public void ejbCreate() {}  public void ejbRemove() {}  public void ejbPassivate() {}  public void setSessionContext(javax.ejb.SessionContext ctx)  {     this.ctx = ctx;  }  // business method  public String getBalance()   throws java.rmi.RemoteException  {   String balance = accessDataTierAccount();   return(balance);  } }
  
  Listing C
  
  
  public class AccountClient {  public String getAccountBalance()  {   try {     javax.naming.Context ctx = getInitialContext();     AccountHome home = (AccountHome)ctx.lookup("Bank.AccountHome");     Account account = home.create();    account.getBalance();   } catch(Exception e) {   }  } }
  
  
  
  現(xiàn)在假設(shè)你想要把多個賬號作為一個全局帳號向表示層公開。假如你已經(jīng)為每個帳號創(chuàng)建了EJB,那么你就能夠使用Listing D里的POJO把每個EJB賬號實例化,并把它們用一個邏輯帳號表示出來。
  
  Listing D
  
  
  public class AccountPOJO {  BankAccount bankAccount;  StockAccount stockAccount;  DeptStoreAccount deptStoreAccount;  public String createEJBs()  {   try {    javax.naming.Context ctx = getInitialContext();     BankAccountHome bankHome =      (BankAccountHome)ctx.lookup("Bank.AccountHome");     bankAccount = bankHome.create();     StockAccountHome stockHome =      (StockAccountHome)ctx.lookup("Stock.AccountHome");     stockAccount = stockHome.create();     DeptStoreAccountHome deptStoreHome =      (DeptStoreAccountHome)ctx.lookup("DeptStore.AccountHome");     deptStoreAccount = deptStoreHome.create();   } catch(Exception e) {   }  }  public AccountInfo[] getAggregateAccountInfo()  {   AccountInfo[] accountInfo = new AccountInfo[3];   accountInfo[0] = new AccountInfo(bankAccount.getInfo());   accountInfo[1] = new AccountInfo(stockAccount.getInfo());   accountInfo[2] = new AccountInfo(deptStoreAccount.getInfo());   return accountInfo;  } }
  
  
  
  結(jié)束語
  
  我們已經(jīng)看到了如何使用JavaBeans來創(chuàng)建多層事務(wù)邏輯,也看到了EJB組件模型如何為分布組件系統(tǒng)添加了許多重要的特性。我們的下一篇文章會探討如何使用EJB同其他對象進行交互操作。我們還會看到更多用于創(chuàng)建JavaBeans和用于訪問其事務(wù)方法的示例代碼。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 浦城县| 苍山县| 新蔡县| 连南| 于田县| 苗栗县| 双峰县| 寿宁县| 五常市| 贞丰县| 济南市| 普安县| 桐柏县| 若尔盖县| 阜平县| 通渭县| 文登市| 宁安市| 吐鲁番市| 金塔县| 监利县| 太白县| 北票市| 禹州市| 凤冈县| 广安市| 宜良县| 怀集县| 淅川县| 黑龙江省| 运城市| 辽宁省| 泽州县| 嘉峪关市| 内江市| 乌拉特后旗| 广丰县| 蒙阴县| 大连市| 朝阳区| 天水市|