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");