
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节。