activiti学习笔记(四) 配置器
时间:2022-05-03
本文章向大家介绍activiti学习笔记(四) 配置器,主要内容包括activiti配置器、activiti配置器的机制、activiti配置器的接口类、activiti的bean方式配置文件、activiti的实现类、activiti配置器的测试结果、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。
activiti配置器
activiti配置器的作用
一般在构建流程实例的时候, 会进行初始化,配置器就是可以在获取了流程配置实例,以及初始化之后可以进行一些额外的配置
activiti配置器的机制
allConfigurators集合添加
在ProcessEngineConfigurationImpl这个类中调用init方法中initConfigurators方法,将所有流程配置器添加到allConfigurators这个集合,流程配置器有两种获取形式,第一种是直接通过bean方式注入到configurators遍历添加到allConfigurators集合,第二种是通过调用spi模式,加载到allConfigurators集合。最后将所有的按照照priority的大小进行排序
public void initConfigurators() {
//一个list集合,存放所有ProcessEngineConfigurator
allConfigurators = new ArrayList<ProcessEngineConfigurator>();
//遍历Configurators将其添加到allConfigurators这个集合
if (configurators != null) {
for (ProcessEngineConfigurator configurator : configurators) {
allConfigurators.add(configurator);
}
}
//获取当前类加载器
if (enableConfiguratorServiceLoader) {
ClassLoader classLoader = getClassLoader();
if (classLoader == null) {
classLoader = ReflectUtil.getClassLoader();
}
//利用spi模式加载ProcessEngineConfigurator所有实现类 将其添加到allConfigurators集合
ServiceLoader<ProcessEngineConfigurator> configuratorServiceLoader = ServiceLoader.load(ProcessEngineConfigurator.class, classLoader);
int nrOfServiceLoadedConfigurators = 0;
for (ProcessEngineConfigurator configurator : configuratorServiceLoader) {
allConfigurators.add(configurator);
nrOfServiceLoadedConfigurators++;
}
if (nrOfServiceLoadedConfigurators > 0) {
log.info("Found {} auto-discoverable Process Engine Configurator{}", nrOfServiceLoadedConfigurators++, nrOfServiceLoadedConfigurators > 1 ? "s" : "");
}
//将allConfigurators进行排序,按照priority1的从大到小
if (!allConfigurators.isEmpty()) {
Collections.sort(allConfigurators, new Comparator<ProcessEngineConfigurator>() {
@Override
public int compare(ProcessEngineConfigurator configurator1, ProcessEngineConfigurator configurator2) {
int priority1 = configurator1.getPriority();
int priority2 = configurator2.getPriority();
if (priority1 < priority2) {
return -1;
} else if (priority1 > priority2) {
return 1;
}
return 0;
}
});
// Execute the configurators
log.info("Found {} Process Engine Configurators in total:", allConfigurators.size());
for (ProcessEngineConfigurator configurator : allConfigurators) {
log.info("{} (priority:{})", configurator.getClass(), configurator.getPriority());
}
}
}
}
初始化调用方法
在ProcessEngineConfigurationImpl调用init方法中configuratorsBeforeInit方法,它会遍历所有的allConfigurators,并调用其中的beforeInit
/**调用所有配置器的beforeInit方法*/
public void configuratorsBeforeInit() {
for (ProcessEngineConfigurator configurator : allConfigurators) {
log.info("Executing beforeInit() of {} (priority:{})", configurator.getClass(), configurator.getPriority());
configurator.beforeInit(this);
}
}
初始化后配置方法调用
在ProcessEngineConfigurationImpl调用init方法中configuratorsAfterInit方法,它会遍历所有的allConfigurators,并调用其中的configure
/**调用所有配置的configure方法*/
public void configuratorsAfterInit() {
for (ProcessEngineConfigurator configurator : allConfigurators) {
log.info("Executing configure() of {} (priority:{})", configurator.getClass(), configurator.getPriority());
configurator.configure(this);
}
}
activiti配置器的接口类
public interface ProcessEngineConfigurator {
/**init方法的第二个方法调用,第一个是获取所有ProcessEngineConfigurator(当前接口的实例) 在初始化前做一些操作*/
void beforeInit(ProcessEngineConfigurationImpl processEngineConfiguration);
/**init方法的最后一个调用,在初始化后可以做一些配置*/
void configure(ProcessEngineConfigurationImpl processEngineConfiguration);
/**使用实例时,首先按照priority进行裴谞,如果你有实例之间的依赖性,自己定义优先级序*/
int getPriority();
}
activiti的bean方式配置文件
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName">
<value>com.mysql.jdbc.Driver</value>
</property>
<property name="url">
<value>jdbc:mysql://127.0.0.1:3306/activiti?useUnicode=true&characterEncoding=UTF-8
</value>
</property>
<property name="username">
<value>root</value>
</property>
<property name="password" value="fadp" />
</bean>
<bean id="processEngineConfigurator1" class="com.activiti_study.ch7.processEngineConfigurator1"></bean>
<bean id="processEngineConfigurator2" class="com.activiti_study.ch7.processEngineConfigurator2"></bean>
<bean id="processEngineConfiguration"
class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
<property name="dataSource" ref="dataSource" />
<property name="processEngineName" value="shareniu" />
<property name="configurators">
<list>
<ref bean="processEngineConfigurator1"/>
<ref bean="processEngineConfigurator2"/>
</list>
</property>
</bean>
</beans>
activiti的实现类
public class processEngineConfigurator1 extends AbstractProcessEngineConfigurator{
@Override
public void beforeInit(
ProcessEngineConfigurationImpl processEngineConfiguration) {
System.out.println("1:beforeInit ");
processEngineConfiguration.setDatabaseSchemaUpdate("true");
}
@Override
public void configure(
ProcessEngineConfigurationImpl processEngineConfiguration) {
System.out.println("1:configure ");
String databaseSchemaUpdate = processEngineConfiguration.getDatabaseSchemaUpdate();
System.out.println(databaseSchemaUpdate+"-----------------");
}
}
public class processEngineConfigurator2 extends AbstractProcessEngineConfigurator{
@Override
public void beforeInit(
ProcessEngineConfigurationImpl processEngineConfiguration) {
System.out.println("2:beforeInit ");
processEngineConfiguration.setDatabaseSchemaUpdate("true");
}
@Override
public void configure(
ProcessEngineConfigurationImpl processEngineConfiguration) {
System.out.println("2:configure ");
String databaseSchemaUpdate = processEngineConfiguration.getDatabaseSchemaUpdate();
System.out.println(databaseSchemaUpdate+"-----------------");
}
}
activit配置器的测试代码
public class App {
@Test
public void getProcessEngine() {
ProcessEngineConfiguration pec = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("com/activiti_study/ch7/activiti1.cfg.xml");
ProcessEngine pe1 = pec.buildProcessEngine();
}
}
activiti配置器的测试结果
1:beforeInit
2:beforeInit
1:configure
true-----------------
2:configure
true-----------------
- Java-单例模式详解(图文并茂,简单易懂)
- Fragment生命周期及实现点击导航图片切换fragment,Demo
- 《GO IN ACTION》读后记录:GO的并发与并行
- SharedPreferences 存List集合,模拟数据库,随时存取
- Servlet与Jsp的结合使用实现信息管理系统一
- Mac下nvm管理node.js版本问题
- 自定义tab吸顶效果一(原理)
- OpenGL ES学习001---绘制三角形
- Android之MaterialDesign应用技术2-仿支付宝上滑搜索框缓慢消失
- 披着狼皮的羊——寻找惠普多款打印机中的RCE漏洞
- Android之MaterialDesign应用技术
- 蛙啊!老母亲给你整理了DEDECMS漏洞集合,快回家!
- Android之Bmob移动后端云服务器
- golang基于redis lua封装的优先级去重队列
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Android流式布局FlowLayout详解
- Linux 专题
- Go语言实现UDP通信
- Android多渠道打包的方法步骤
- Android编程实现压缩图片并加载显示的方法
- Android串口通信封装之OkUSB的示例代码
- Android 中Activity 之间传递参数
- Android开发简单实现摇动动画的方法
- Android 中menu同时显示图标和文字的实现
- android基于SwipeRefreshLayout实现类QQ的侧滑删除
- PopupWindow自定义位置显示的实现代码
- Bootstrap 下拉菜单.dropdown的具体使用方法
- Android访问assets本地json文件的方法
- Android延时操作的三种方法
- 5步教你快速写一个android Router路由框架