自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

EJB容器的存取和實(shí)現(xiàn)

開發(fā) 后端
本文向您介紹EJB容器的存取和實(shí)現(xiàn),以及EJB容器載入目標(biāo)EJB前載入bean容器時(shí),我們就可能會遇到問題

本文我們來看看Spring是如何幫助我們訪問和實(shí)現(xiàn)EJB組件的。尤其是在訪問 無狀態(tài)Session Bean(SLSBs)的時(shí)候,Spring特別有用,現(xiàn)在我們就由此開始討論。

1、訪問EJB

概念要調(diào)用本地或遠(yuǎn)程無狀態(tài)Session Bean上的方法,通??蛻舳说拇a必須 進(jìn)行JNDI查找,得到(本地或遠(yuǎn)程的)EJB Home對象,然后調(diào)用該對象的"create" 方法,才能得到實(shí)際的(本地或遠(yuǎn)程的)EJB對象。前后調(diào)用了不止一個(gè)EJB組件 上的方法。
  
為了避免重復(fù)的底層調(diào)用,很多EJB應(yīng)用使用了服務(wù)定位器(Service Locator) 和業(yè)務(wù)委托(Bussiness Delegate)模式,這樣要比在客戶端代碼中到處進(jìn)行JNDI 查找更好些,不過它們的常見的實(shí)現(xiàn)都有明顯的缺陷。例如:
  
通常,若是依賴于服務(wù)定位器或業(yè)務(wù)代理單件來使用EJB容器,則很難對代碼進(jìn) 行測試。
  
在僅使用了服務(wù)定位器模式而不使用業(yè)務(wù)委托模式的情況下,應(yīng)用程序 代碼仍然需要調(diào)用EJB Home組件的create方法,還是要處理由此引入的異常。 導(dǎo)致代碼仍然保留了與EJB API的耦合性以及EJB編程模型的復(fù)雜性。
  
實(shí)現(xiàn)業(yè)務(wù)委托模式通常會導(dǎo)致大量的冗余代碼,因?yàn)槲覀儾坏貌痪帉?很多方法,而它們所做的僅僅是調(diào)用EJB組件的同名方法。

Spring采用的方法是允許創(chuàng)建并使用代理對象,一般是在Spring的 ApplicationContext或BeanFactory里面進(jìn)行配置,這樣就和業(yè)務(wù)代理類似,只需要 少量的代碼。我們不再需要另外編寫額外的服務(wù)定位器或JNDI查找的代碼,或者是手寫 的業(yè)務(wù)委托對象里面冗余的方法,除非它們可以帶來實(shí)質(zhì)性的好處。

2、訪問本地的無狀態(tài)Session Bean(SLSB)

假設(shè)有一個(gè) web控制器需要使用本地EJB組件。我們遵循前人的實(shí)踐經(jīng)驗(yàn), 于是使用了EJB的業(yè)務(wù)方法接口(Business Methods Interface)模式,這樣, 這個(gè)EJB組件的本地接口就擴(kuò)展了非EJB特定的業(yè)務(wù)方法接口。讓我們假定這個(gè) 業(yè)務(wù)方法接口叫MyComponent.(使用業(yè)務(wù)方法接口模式的一個(gè)主要原因就是為了保證本地接口和bean的實(shí)現(xiàn)類 之間方法簽名的同步是自動的。另外一個(gè)原因是它使得稍后我們改用基于 POJO(簡單Java對象) 的服務(wù)實(shí)現(xiàn)更加容易,只要這樣的改變是有利的。當(dāng)然,我們也需要實(shí)現(xiàn) 本地Home接口,并提供一個(gè)Bean實(shí)現(xiàn)類,使其實(shí)現(xiàn)接口SessionBean和業(yè)務(wù)方法接口 MyComponent.現(xiàn)在為了把我們Web層的控制器和EJB的實(shí)現(xiàn)鏈接起來,我們唯一要寫 的 Java代碼就是在控制器上公布一個(gè)形參為MyComponent的setter方法。這樣就可以 把這個(gè)引用保存在控制器的一個(gè)實(shí)例變量中。

 

  1. private MyComponent myComponent;  
  2. public void setMyComponent(MyComponent myComponent) {  
  3.     this.myComponent = myComponent; 

 

然后我們可以在控制器的任意業(yè)務(wù)方法里面使用這個(gè)實(shí)例變量。假設(shè)我們現(xiàn)在 從Spring的 ApplicationContext或BeanFactory獲得該控制器對象,我們就可以在 同一個(gè)上下文中配置一個(gè) LocalStatelessSessionProxyFactoryBean 的實(shí)例,它將作為EJB組件的代理對象。這個(gè)代理對象的配置和控制器的屬性 myComponent的設(shè)置是使用一個(gè)配置項(xiàng)完成的,如下所示:

 
  1. class="org.springframework.ejb.access。LocalStatelessSessionProxyFactoryBean"> 
  2.     myComponent  
  3.     com.mycom.MyComponent 

 

這些看似簡單的代碼背后隱藏了很多復(fù)雜的處理,比如默默工作的Spring AOP框架,我們甚至不必知道這些概念,一樣可以享用它的結(jié)果。Bean myComponent 的定義中創(chuàng)建了一個(gè)該EJB組件的代理對象,它實(shí)現(xiàn)了業(yè)務(wù)方法接口。這個(gè)EJB組件的 本地Home對象在啟動的時(shí)候就被放到了緩存中,所以只需要執(zhí)行一次JNDI查找即可。 每當(dāng)EJB組件被調(diào)用的時(shí)候,這個(gè)代理對象就調(diào)用本地EJB組件的create方法,并調(diào)用 該EJB組件的相應(yīng)的業(yè)務(wù)方法。
  
在Bean myController的定義中,控制器類的屬性 myController的值被設(shè)置為上面代理對象。
  
這樣的EJB組件訪問方式大大簡化了應(yīng)用程序代碼:Web層(或其他EJB客戶端) 的代碼不再依賴于EJB組件的使用。如果我們想把這個(gè)EJB的引用替換為一個(gè)POJO, 或者是模擬用的對象或其他測試組件,我們只需要簡單地修改Bean myComponent 的定義中僅僅一行Java代碼,此外,我們也不再需要在應(yīng)用程序中編寫任何JNDI查找 或其它EJB容器相關(guān)的代碼。
  
評測和實(shí)際應(yīng)用中的經(jīng)驗(yàn)表明,這種方式的性能負(fù)荷極小,(盡管其中 使用了反射方式以調(diào)用目標(biāo)EJB組件的方法),通常的使用中我們幾乎覺察不出。請記住 我們并不想頻繁地調(diào)用EJB組件的底層方法,雖然如此,有些性能代價(jià)是與應(yīng)用服務(wù)器 中EJB的基礎(chǔ)框架相關(guān)的。
  
關(guān)于JNDI查找有一點(diǎn)需要注意。在Bean容器中,這個(gè)類通常最好用作單件 (沒理由使之成為原型)。不過,如果這個(gè)Bean容器會預(yù)先實(shí)例化單件(類似XML ApplicationContext的變體的行為),如果在EJB容器載入目標(biāo)EJB前載入bean容器, 我們就可能會遇到問題。因?yàn)?JNDI查找會在該類的init方法中被執(zhí)行并且緩存結(jié)果, 這樣就導(dǎo)致該EJB不能被綁定到目標(biāo)位置。解決方案就是不要預(yù)先實(shí)例化這個(gè)工廠對象, 而允許它在第一次用到的時(shí)候再創(chuàng)建,在XML容器中,這是通過屬性 lazy-init來控制的。

【編輯推薦】

  1. 關(guān)于EJB的一些常見問題
  2. 如何通過遠(yuǎn)程客戶端跨JVM遠(yuǎn)程訪問EJB
  3. Eclipse+JBoss+EJB3的Session Bean注釋方法
  4. EJB3.1新特性一覽 Time服務(wù)更強(qiáng)大
  5. 利用mod_jk整合Apache與JBoss
責(zé)任編輯:佚名 來源: IT技術(shù)
相關(guān)推薦

2009-06-11 15:26:05

EJB組件EJB容器

2009-06-11 14:11:01

EJB容器Java

2009-06-26 14:54:18

Spring支持EJB

2009-06-12 12:46:59

EJB3.0

2009-06-11 16:25:44

EJB2.0EJB

2009-06-11 17:37:32

EJB注釋

2009-06-12 09:41:07

EJB3.0Spring

2009-06-22 16:19:45

JavaBeansEJBPOJO

2009-06-26 14:37:10

EJB和Spring

2009-06-12 10:16:27

EJB分類

2009-06-22 16:59:33

POJOSpringEJB 3.0

2009-06-26 14:29:03

2009-06-11 16:53:09

什么是EJBEJB

2010-07-16 13:57:13

Perl哈希表

2009-06-25 16:35:12

EJB技術(shù)

2009-10-29 09:52:55

OSGi

2009-06-26 14:21:08

JDOEJB CMPHibernate

2009-06-12 11:46:39

JavaBeanEJB

2009-06-26 15:58:28

EJB

2009-06-11 14:25:17

EJBJava
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號