天天看點

bboss persistent事務管理介紹 (十)

4.9.9.3 BaseSPIManager元件

l        包路徑及接口說明

BaseSPIManager的完整包路徑如下:

com.chinacreator.spi.BaseSPIManager

BaseSPIManager提供了以下兩個靜态管理接口:

l         接口1  擷取id為managerid的管理服務接口執行個體

AI a = (AI)BaseSPIManager.getProvider("managerid");

l         接口2  擷取id為managerid的管理服務接口執行個體,參數二對應多個provider中相應的provider 類型辨別

AI a = (AI)BaseSPIManager.getProvider("managerid","providertype");

方法1和方法2的差別是:方法1的傳回值和抛出的異常以預設的provider的相應方法的傳回值和異常為準,方法2傳回值和抛出的異常以指定類型的provider的相應方法的傳回值和異常為準。方法1和方法2的事務管理機制是一緻和相同的。

這兩個接口傳回的對象類型為java.lang.Object,調用程式可以将該對象轉型為相應的元件接口類型。

l        使用BaseSPIManager擷取元件執行個體和直接建立元件執行個體的差別

隻有通過BaseSPIManager提供的兩個方法擷取接口執行個體,然後在接口執行個體上調用事務方法,聲明的事務管理才會生效,否則無效。舉例說明如下:

假如接口AI和接口實作類A,接口中定義了方法handle,并且将該方法聲明為事務方法,

在配置檔案中做以下的配置:

<manager id="test.A" singlable="true" >

<provider type="DB" default="true"

           class="test.A" />

<transactions>

<method name="handle" txtype="REQUIRED_TRANSACTION"/>

</transactions>

</manager>

聲明元件的管理id為test.A,我們通過以下兩種方式擷取接口執行個體:

方法1 直接建立對象執行個體a,在執行個體a上調用handle方法

AI a = new A();

a.handle();

采用這種方式時,為handle方法聲明的事務不會生效。

方法2 通過BaseSPIManager提供的接口擷取接口執行個體

AI a = (AI)BaseSPIManager.getProvider("test.A");

采用這種方式,為handle方法聲明的事務才會生效。

業務元件必須由兩部分組成:元件接口,元件接口的實作類;這是因為通過BaseSPIManager的兩個方法所擷取到的對象必需是一個接口對象,這裡不能直接将傳回值直接轉換為具體的實作類型,以下的用法是正确的:

以下的用法是不正确的,但是編譯時不會報錯,運作時會報類型轉換錯誤,這是因為方法傳回的是一個實作接口AI的代理對象,而不是一個A類型的對象了:

A a = (A)BaseSPIManager.getProvider("test.A");

繼續閱讀