官术网_书友最值得收藏!

2.5 配置器

代碼清單2-20中initConfigurators方法所做的工作就是初始化“配置器”,上文講解的兩種配置風格的配置文件中分別定義了不同的流程引擎配置類,例如StandaloneProcess-EngineConfiguration類,但是在XML中定義流程引擎配置類有如下三個缺點。

(1)不靈活,所有的屬性信息都需要在XML文檔中進行配置。

(2)不能滿足動態屬性配置需求,如果開發人員打算使用編程方式構造流程引擎配置類的實例對象,則這種方式幾乎不可能實現。

(3)不能檢查必要的屬性值是否已經被初始化,比如開發人員期望檢查數據源的信息,則配置方式不能達到這個訴求。

2.5.1 初始化配置器

Activiti在5.13版本中增加了“配置器”,進而可以通過編程的方式動態修改或者刷新流程引擎配置類實例對象中的屬性值,所有的配置器均需要實現ProcessEngine-Configurator接口。下面分析initConfigurators方法的處理過程,如代碼清單2-21所示。

代碼清單2-21 ProcessEngineConfigurationImpl.java

下面對initConfigurators方法的處理邏輯加以總結。

(1)第5行實例化allConfigurators集合,該集合用于存儲所有的配置器實例。

(2)第6行判斷開關屬性configurators是否為空,如果該屬性值不為空,則循環遍歷該集合,并將遍歷的值添加到allConfigurators集合中。

(3)判斷開關屬性enableConfiguratorServiceLoader是否為true,如果是則執行后續操作,該值默認為true。

? 第12行獲取類加載器實例classLoader。

? 第16~17行利用Java中的ServiceLoader特性加載ProcessEngineConfigurator實例集合,第18~19行循環遍歷configuratorServiceLoader集合并將遍歷的值添加到allConfigurators集合中?!?第21行判斷allConfigurators集合是否為空,如果不為空,則執行第22~30行對該集合中的元素按照ProcessEngineConfigurator類中getPriority方法的返回值進行升序排序。

注意

classLoader為開關屬性。

2.5.2 配置器實戰

上面詳細講解了配置器的初始化過程,下面討論一下配置器的全局架構(如圖2-4所示)。

圖2-4 ProcessEngineConfigurator架構圖

(1)ProcessEngineConfigurator:該接口定義了beforeInit方法(在configuratorsBeforeInit方法中調用)、configure方法(在configuratorsAfterInit方法中調用)、getPriority方法(在初始化配置器方法initConfigurators中調用)。

(2)AbstractProcessEngineConfigurator:對ProcessEngineConfigurator接口進行了實現,作為模板抽象類存在,并重寫了getPriority方法,該方法的返回值默認為10000。

了解以上知識點之后,接下來學習如何自定義配置器并修改流程引擎配置類實例的屬性值,相關實現如代碼清單2-22所示。

代碼清單2-22 ShareniuConfiguratorA.java

定義了配置器之后,接下來的工作就是把自定義配置器注入流程引擎配置類,如代碼清單2-23所示。

代碼清單2-23 activiti.cfg.xml

對自定義配置器進行測試驗證,具體實現如代碼清單2-24所示。

代碼清單2-24 App.java

執行上述代碼,得到輸出結果如下:

        A:beforeInit
        A:configure

在學習自定義配置器的同時,也學會了如何通過獲取以及設置ProcessEngineConfigur-ationImpl實例對象的屬性值,關于配置器更高級的用法以及使用技巧可以參考8.10.4節。

主站蜘蛛池模板: 中山市| 承德县| 江西省| 崇左市| 盐亭县| 茂名市| 盘山县| 新津县| 万荣县| 昔阳县| 濉溪县| 青浦区| 岳普湖县| 牟定县| 昌乐县| 连州市| 那坡县| 广宁县| 东阳市| 怀来县| 墨脱县| 桃园县| 基隆市| 贡山| 明溪县| 龙南县| 原阳县| 安义县| 建阳市| 屏东市| 奉新县| 库尔勒市| 九江市| 安远县| 金阳县| 仙游县| 漳平市| 景宁| 德阳市| 昌平区| 三亚市|