亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? ejb的存取和實現(xiàn).txt

?? 作為輕量級的容器
?? TXT
字號:
EJB的存取和實現(xiàn) 

作為輕量級的容器,Spring常常被認(rèn)為是EJB的替代品。我們也相信,對于很多 (不一定是絕大多數(shù))應(yīng)用和用例,相對于通過EJB容器來實現(xiàn)相同的功能而言, Sping作為容器,加上它在事務(wù),ORM和JDBC存取這些領(lǐng)域中豐富的功能支持, Spring的確是更好的選擇。 

不過,需要特別注意的是,使用了Spring并不是說我們就不能用EJB了, 實際上,Spring大大簡化了從中訪問和實現(xiàn)EJB組件或只實現(xiàn)(EJB組件)其功能的復(fù)雜性。 另外,如果通過Spring來訪問EJB組件服務(wù),以后就可以在本地EJB組件,遠(yuǎn)程EJB組件, 或者是POJO(簡單Java對象)這些變體之間透明地切換服務(wù)的實現(xiàn),而不需要修改 客戶端的代碼。 

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

訪問EJB 
概念 
要調(diào)用本地或遠(yuǎn)程無狀態(tài)Session Bean上的方法,通常客戶端的代碼必須 進(jìn)行JNDI查找,得到(本地或遠(yuǎn)程的)EJB Home對象,然后調(diào)用該對象的"create" 方法,才能得到實際的(本地或遠(yuǎn)程的)EJB對象。前后調(diào)用了不止一個EJB組件 上的方法。 

為了避免重復(fù)的底層調(diào)用,很多EJB應(yīng)用使用了服務(wù)定位器(Service Locator) 和業(yè)務(wù)委托(Bussiness Delegate)模式,這樣要比在客戶端代碼中到處進(jìn)行JNDI 查找更好些,不過它們的常見的實現(xiàn)都有明顯的缺陷。例如: 

通常,若是依賴于服務(wù)定位器或業(yè)務(wù)代理單件來使用EJB,則很難對代碼進(jìn) 行測試。 

在僅使用了服務(wù)定位器模式而不使用業(yè)務(wù)委托模式的情況下,應(yīng)用程序 代碼仍然需要調(diào)用EJB Home組件的create方法,還是要處理由此引入的異常。 導(dǎo)致代碼仍然保留了與EJB API的耦合性以及EJB編程模型的復(fù)雜性。 

實現(xiàn)業(yè)務(wù)委托模式通常會導(dǎo)致大量的冗余代碼,因為我們不得不編寫 很多方法,而它們所做的僅僅是調(diào)用EJB組件的同名方法。 

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

訪問本地的無狀態(tài)Session Bean(SLSB) 
假設(shè)有一個web控制器需要使用本地EJB組件。我們遵循前人的實踐經(jīng)驗, 于是使用了EJB的業(yè)務(wù)方法接口(Business Methods Interface)模式,這樣, 這個EJB組件的本地接口就擴展了非EJB特定的業(yè)務(wù)方法接口。讓我們假定這個 業(yè)務(wù)方法接口叫MyComponent。 public interface MyComponent {
...
} 
(使用業(yè)務(wù)方法接口模式的一個主要原因就是為了保證本地接口和bean的實現(xiàn)類 之間方法簽名的同步是自動的。另外一個原因是它使得稍后我們改用基于POJO(簡單Java對象) 的服務(wù)實現(xiàn)更加容易,只要這樣的改變是有利的。當(dāng)然,我們也需要實現(xiàn) 本地Home接口,并提供一個Bean實現(xiàn)類,使其實現(xiàn)接口SessionBean和業(yè)務(wù)方法接口 MyComponent。現(xiàn)在為了把我們Web層的控制器和EJB的實現(xiàn)鏈接起來,我們唯一要寫 的Java代碼就是在控制器上公布一個形參為MyComponent的setter方法。這樣就可以 把這個引用保存在控制器的一個實例變量中。 private MyComponent myComponent;
public void setMyComponent(MyComponent myComponent) {
this.myComponent = myComponent;
} 
然后我們可以在控制器的任意業(yè)務(wù)方法里面使用這個實例變量。假設(shè)我們現(xiàn)在 從Spring的ApplicationContext或BeanFactory獲得該控制器對象,我們就可以在 同一個上下文中配置一個LocalStatelessSessionProxyFactoryBean 的實例,它將作為EJB組件的代理對象。這個代理對象的配置和控制器的屬性 myComponent的設(shè)置是使用一個配置項完成的,如下所示: <bean id="myComponent"
class="org.springframework.ejb.access.LocalStatelessSessionProxyFactoryBean">
<property name="jndiName"><value>myComponent</value></property>
<property name="businessInterface"><value>com.mycom.MyComponent</value></property>
</bean>
<bean id="myController" class = "com.mycom.myController">
<property name="myComponent"><ref bean="myComponent"/></property>
</bean> 
這些看似簡單的代碼背后隱藏了很多復(fù)雜的處理,比如默默工作的Spring AOP框架,我們甚至不必知道這些概念,一樣可以享用它的結(jié)果。Bean myComponent 的定義中創(chuàng)建了一個該EJB組件的代理對象,它實現(xiàn)了業(yè)務(wù)方法接口。這個EJB組件的 本地Home對象在啟動的時候就被放到了緩存中,所以只需要執(zhí)行一次JNDI查找即可。 每當(dāng)EJB組件被調(diào)用的時候,這個代理對象就調(diào)用本地EJB組件的create方法,并調(diào)用 該EJB組件的相應(yīng)的業(yè)務(wù)方法。 

在Bean myController的定義中,控制器類的屬性 myController的值被設(shè)置為上面代理對象。 

這樣的EJB組件訪問方式大大簡化了應(yīng)用程序代碼:Web層(或其他EJB客戶端) 的代碼不再依賴于EJB組件的使用。如果我們想把這個EJB的引用替換為一個POJO, 或者是模擬用的對象或其他測試組件,我們只需要簡單地修改Bean myComponent 的定義中僅僅一行Java代碼,此外,我們也不再需要在應(yīng)用程序中編寫任何JNDI查找 或其它EJB相關(guān)的代碼。 

評測和實際應(yīng)用中的經(jīng)驗表明,這種方式的性能負(fù)荷極小,(盡管其中 使用了反射方式以調(diào)用目標(biāo)EJB組件的方法),通常的使用中我們幾乎覺察不出。請記住 我們并不想頻繁地調(diào)用EJB組件的底層方法,雖然如此,有些性能代價是與應(yīng)用服務(wù)器 中EJB的基礎(chǔ)框架相關(guān)的。 

關(guān)于JNDI查找有一點需要注意。在Bean容器中,這個類通常最好用作單件 (沒理由使之成為原型)。不過,如果這個Bean容器會預(yù)先實例化單件(類似XML ApplicationContext的變體的行為),如果在EJB容器載入目標(biāo)EJB前載入bean容器, 我們就可能會遇到問題。因為JNDI查找會在該類的init方法中被執(zhí)行并且緩存結(jié)果, 這樣就導(dǎo)致該EJB不能被綁定到目標(biāo)位置。解決方案就是不要預(yù)先實例化這個工廠對象, 而允許它在第一次用到的時候再創(chuàng)建,在XML容器中,這是通過屬性 lazy-init來控制的。 

盡管大部分Spring的用戶不會對這些感興趣,但那些對EJB進(jìn)行AOP的具體應(yīng)用 的用戶則會想看看LocalSlsbInvokerInterceptor。 

訪問遠(yuǎn)程的無狀態(tài)Session Bean(SLSB) 
基本上訪問遠(yuǎn)程EJB與訪問本地EJB差別不大,除了前者使用的是 SimpleRemoteStatelessSessionProxyFactoryBean。當(dāng)然, 無論是否使用Spring,遠(yuǎn)程調(diào)用的語義都相同,不過,對于使用的場景和錯誤處理 來說,調(diào)用另外一臺計算機上不同虛擬機中的對象的方法其處理有所不同。 

與不使用Spring方式的EJB客戶端相比,Spring的EJB客戶端有一個額外的 好處。通常如果客戶端代碼隨意在本地EJB和遠(yuǎn)程EJB的調(diào)用之間來回切換,就有 一個問題。這是因為遠(yuǎn)程接口的方法需要聲明其會拋出RemoteException ,然后客戶端代碼必須處理這種異常,但是本地接口的方法卻不需要這樣。 如果要把針對本地EJB的代碼改為訪問遠(yuǎn)程EJB,就需要修改客戶端代碼,增加 對RemoteException的處理,反之就需要去掉這樣的 異常處理。使用Spring 的遠(yuǎn)程EJB代理,我們就不再需要在業(yè)務(wù)方法接口和EJB的 代碼實現(xiàn)中聲明會拋出RemoteException,而是定義一個 相似的遠(yuǎn)程接口,唯一不同就是它拋出的是RemoteAccessException, 然后交給代理對象去動態(tài)的協(xié)調(diào)這兩個接口。也就是說,客戶端代碼不再需要與 RemoteException這個顯式(checked)異常打交道,實際運行中 所有拋出的異常RemoteException都會被捕獲并轉(zhuǎn)換成一個 隱式(non-checked)的RemoteAccessException,它是 RuntimeException的一個子類。這樣目標(biāo)服務(wù)端就可以 在本地EJB或遠(yuǎn)程EJB(甚至POJO)之間隨意地切換,客戶端不再需要關(guān)心甚至 根本不會覺察到這種切換。當(dāng)然,這些都是可選的,我們并不阻止在業(yè)務(wù)接口中聲明 異常RemoteExceptions。 

使用Spring提供的輔助類實現(xiàn)EJB組件 
Spring也提供了一些輔助類來為EJB組件的實現(xiàn)提供便利。它們是為了倡導(dǎo)一些 好的實踐經(jīng)驗,比如把業(yè)務(wù)邏輯放在在EJB層之后的POJO中實現(xiàn),只把事務(wù)隔離和 遠(yuǎn)程調(diào)用這些職責(zé)留給EJB。 

要實現(xiàn)一個無狀態(tài)或有狀態(tài)的Session Bean,或消息驅(qū)動Bean,我們的實現(xiàn) 可以繼承分別繼承AbstractStatelessSessionBean, AbstractStatefulSessionBean,和 AbstractMessageDrivenBean/AbstractJmsMessageDrivenBean 

考慮這個例子:我們把無狀態(tài)Session Bean的實現(xiàn)委托給普通的Java服務(wù)對象。 業(yè)務(wù)接口的定義如下: public interface MyComponent {
public void myMethod(...);
...
}
這是簡單Java對象實現(xiàn)方式的類:
public class MyComponentImpl implements MyComponent {
public String myMethod(...) {
...
}
...
}
最后是無狀態(tài)Session Bean自身:
public class MyComponentEJB implements extends AbstractStatelessSessionBean
implements MyComponent {
MyComponent _myComp;
/**
* Obtain our POJO service object from the BeanFactory/ApplicationContext
* @see org.springframework.ejb.support.AbstractStatelessSessionBean#onEjbCreate()
*/
protected void onEjbCreate() throws CreateException {
_myComp = (MyComponent) getBeanFactory().getBean(
ServicesConstants.CONTEXT_MYCOMP_ID);
}
// for business method, delegate to POJO service impl. 
public String myMethod(...) {
return _myComp.myMethod(...);
}
...
} 
Spring為支持EJB而提供的這些基類默認(rèn)情況下會創(chuàng)建并載入一個BeanFactory (這個例子里,它是ApplicationContext的子類),作為其生命周期的一部分, 供EJB使用(比如像上面的代碼那樣用來獲取POJO服務(wù)對象)。載入的工作是通過 一個策略對象完成的,它是BeanFactoryLocator的子類。 默認(rèn)情況下,實際使用的BeanFactoryLocator的實現(xiàn)類是 ContextJndiBeanFactoryLocator,它根據(jù)一個JNDI環(huán)境變量 來創(chuàng)建一個ApplicationContext對象(這里是EJB類,路徑是 java:comp/env/ejb/BeanFactoryPath)。如果需要改變 BeanFactory或ApplicationContext的載入策略,我們可以在子類中重定義了的 setSessionContext()方法或具體EJB子類的構(gòu)造函數(shù)中調(diào)用 setBeanFactoryLocator()方法來改變默認(rèn)使用的 BeanFactoryLocator實現(xiàn)類。具體細(xì)節(jié)請參考JavaDoc。 

如JavaDoc中所述,有狀態(tài)Session Bean在其生命周期中可能會被鈍化并重新激活, 如果是不可序列化的BeanFactory或ApplicationContext,由于它們不會被EJB容器保存, 所以還需要手動在ejbPassivate和ejbActivate 這兩個方法中分別調(diào)用unloadBeanFactory()和loadBeanFactory, 才能在鈍化或激活的時候卸載或載入。 

有些情況下,要載入ApplicationContext以使用EJB組件, ContextJndiBeanFactoryLocator的默認(rèn)實現(xiàn)基本上足夠了, 不過,當(dāng)ApplicationContext需要載入多個bean,或這些bean初始化所需的時間或內(nèi)存 很多的時候(例如Hibernate的SessionFactory的初始化),就有可能出問題,因為 每個EJB組件都有自己的副本。這種情況下,用戶會想重載 ContextJndiBeanFactoryLocator的默認(rèn)實現(xiàn),并使用其它 BeanFactoryLocator的變體,例如ContextSingleton 或者BeanFactoryLocator,他們可以載入并共享一個 BeanFactory或ApplicationContext來為多個EJB組件或其它客戶端所公用。這樣做 相當(dāng)簡單,只需要給EJB添加類似于如下的代碼: /**
* Override default BeanFactoryLocator implementation
*
* @see javax.ejb.SessionBean#setSessionContext(javax.ejb.SessionContext)
*/
public void setSessionContext(SessionContext sessionContext) {
super.setSessionContext(sessionContext);
setBeanFactoryLocator(ContextSingletonBeanFactoryLocator.getInstance());
setBeanFactoryLocatorKey(ServicesConstants.PRIMARY_CONTEXT_ID);
} 
 

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产成人午夜视频| 亚洲精品免费在线观看| 久久精品国产免费看久久精品| 欧美蜜桃一区二区三区| 图片区小说区区亚洲影院| 91精品国产欧美一区二区18| 日韩精品亚洲专区| 精品国产网站在线观看| 国产九色sp调教91| 中文字幕一区二区三中文字幕| 99re66热这里只有精品3直播| 亚洲免费电影在线| 欧美日韩精品一区视频| 狠狠色丁香久久婷婷综合丁香| 国产日韩欧美在线一区| 99在线精品视频| 亚洲高清视频在线| 国产精品久久久久久久岛一牛影视| 成人午夜激情在线| 亚洲综合小说图片| 日韩欧美在线不卡| 成人h动漫精品一区二区| 亚洲卡通欧美制服中文| 日韩小视频在线观看专区| 国产白丝网站精品污在线入口| 亚洲精品久久久蜜桃| 日韩欧美综合一区| 91丝袜美女网| 狠狠狠色丁香婷婷综合激情| 亚洲青青青在线视频| 欧美成人伊人久久综合网| 粉嫩一区二区三区在线看| 亚洲国产精品久久不卡毛片| 久久欧美中文字幕| 在线精品视频一区二区三四| 国产一区二区三区四区在线观看| 亚洲欧美日韩精品久久久久| 欧美一区二区精品在线| 91亚洲国产成人精品一区二区三 | 亚洲国产成人av好男人在线观看| 日韩精品中文字幕一区| 日韩欧美三级在线| 91在线精品一区二区| 蜜臀av性久久久久蜜臀av麻豆| 亚洲欧洲精品一区二区三区不卡| 日韩一级完整毛片| 日本电影欧美片| 成人综合婷婷国产精品久久| 免费不卡在线视频| 亚洲国产一区二区视频| 中文字幕不卡在线播放| 欧美成人vps| 欧美电影一区二区| 97aⅴ精品视频一二三区| 国产一区二区91| 免费观看成人av| 日韩国产欧美在线观看| 亚洲综合免费观看高清完整版在线 | 精品国产乱码久久久久久免费 | 日韩一区二区三区高清免费看看| 一本一道久久a久久精品综合蜜臀| 国产一区不卡精品| 蜜臂av日日欢夜夜爽一区| 亚洲r级在线视频| 亚洲五月六月丁香激情| 亚洲欧美日韩久久精品| 国产精品女同一区二区三区| 久久久久久久精| 亚洲精品一区二区在线观看| 91精选在线观看| 在线成人av影院| 欧美亚洲国产怡红院影院| 色婷婷av一区二区三区gif| 成人黄色在线看| 99国产精品一区| 91丝袜高跟美女视频| 色偷偷久久一区二区三区| 成人精品国产免费网站| 91小视频免费看| 色偷偷成人一区二区三区91| 色偷偷88欧美精品久久久| 欧美性淫爽ww久久久久无| 欧洲亚洲精品在线| 欧美日韩一卡二卡| 欧美日韩国产综合草草| 欧美精品在线观看播放| 欧美一卡二卡在线| 精品国产91久久久久久久妲己| 久久色在线视频| 国产精品免费aⅴ片在线观看| 亚洲欧美综合网| 一区二区三区精品久久久| 亚洲gay无套男同| 免费看精品久久片| 国产精品18久久久久| 99久久免费国产| 欧美精品电影在线播放| 精品久久久久久久久久久院品网 | 激情六月婷婷久久| 国产成人av一区二区| 91丨九色丨尤物| 911精品产国品一二三产区| 精品国产伦一区二区三区观看体验 | 亚洲精品五月天| 午夜精彩视频在线观看不卡| 日本sm残虐另类| 成人精品国产免费网站| 欧美日韩一区二区三区不卡| 精品国产百合女同互慰| 亚洲天堂福利av| 美女脱光内衣内裤视频久久影院| 国产成人精品免费一区二区| 欧美伊人精品成人久久综合97| 日韩精品一区在线观看| 最新高清无码专区| 奇米影视7777精品一区二区| 激情欧美一区二区| 欧美在线综合视频| 欧美一级搡bbbb搡bbbb| 亚洲视频一区二区在线观看| 亚洲电影你懂得| 国产精品一品二品| 在线免费观看日本一区| 日韩手机在线导航| 中文字幕色av一区二区三区| 首页国产欧美久久| 99免费精品视频| 精品99一区二区三区| 亚洲一区日韩精品中文字幕| 岛国精品在线观看| 91麻豆精品91久久久久久清纯| 国产日韩视频一区二区三区| 午夜精品久久久久| 国产成人精品影视| 欧美欧美午夜aⅴ在线观看| 国产精品麻豆一区二区| 奇米一区二区三区| 91福利在线看| 国产精品毛片大码女人| 精品一区二区日韩| 97se亚洲国产综合在线| 精品国产一区二区三区四区四| 亚洲福利视频三区| 91小视频在线免费看| 国产精品日日摸夜夜摸av| 激情五月播播久久久精品| 欧美日韩一二区| 尤物在线观看一区| 91欧美一区二区| 欧美高清在线视频| 国产成人av电影在线播放| 欧美大片在线观看一区二区| 婷婷久久综合九色国产成人| 日本久久电影网| 亚洲视频一二区| 北岛玲一区二区三区四区| 精品对白一区国产伦| 精品亚洲欧美一区| 欧美v国产在线一区二区三区| 蜜桃视频一区二区三区在线观看| 在线观看精品一区| 亚洲综合色噜噜狠狠| 日本韩国欧美国产| 一区二区三区在线免费播放| 成人性生交大片免费看视频在线| 久久久久久久综合| 国产999精品久久久久久| 国产亚洲美州欧州综合国| 日韩电影在线免费看| 日韩一区二区视频在线观看| 麻豆国产欧美日韩综合精品二区| 7777精品久久久大香线蕉| 亚洲一区二区三区在线播放| 色悠悠久久综合| 亚洲大片精品永久免费| 91精品国产欧美日韩| 欧美aaaaa成人免费观看视频| 日韩视频免费观看高清在线视频| 麻豆极品一区二区三区| 精品国产三级a在线观看| 国产凹凸在线观看一区二区| **性色生活片久久毛片| 日本电影亚洲天堂一区| 亚洲bt欧美bt精品777| 欧美大片免费久久精品三p| 久久国产精品72免费观看| 久久久青草青青国产亚洲免观| 国产成人精品综合在线观看| 自拍偷拍亚洲欧美日韩| 欧美麻豆精品久久久久久| 精品午夜久久福利影院| 欧美韩国日本不卡| 在线免费观看日本欧美| 久久99日本精品| 亚洲欧美另类在线| 欧美日韩成人一区| 国产精品18久久久| 亚洲亚洲人成综合网络| 精品国产三级a在线观看| eeuss鲁一区二区三区|