Activiti UEL表达式是如何与Spring 的容器整合起来的
Activiti UEL 表达式
UEL表达式到底是什么呢?
UEL是java EE6规范的一部分,UEL(Unified Expression Language)即统一表达式语言,activiti支持两个UEL表达式:UEL-value和UEL-method
Activiti使用UEL进行表达式解析(有关详细信息,请参阅EE6规范)
Activiti 如何使用UEL表达式获取Spring 容器中的bean?
答案在activiti-spring.jar中
SpringExpressionManager.java //spring表达式管理类
public class SpringExpressionManager extends ExpressionManager {//应用上下文protected ApplicationContext applicationContext;public SpringExpressionManager(ApplicationContext applicationContext, Map<Object, Object> beans) {super(beans);//这个beans是流程引擎中的beansthis.applicationContext = applicationContext;}@Overrideprotected ELResolver createElResolver(VariableScope variableScope) {//复合el表达式CompositeELResolver compositeElResolver = new CompositeELResolver();compositeElResolver.add(new VariableScopeElResolver(variableScope));//判断beans是否为空if (beans != null) {// 在表达式中只暴露流程引擎中的beanscompositeElResolver.add(new ReadOnlyMapELResolver(beans));} else {// 在表达式中暴露整个application-contextcompositeElResolver.add(new ApplicationContextElResolver(applicationContext));}//添加数组解析器compositeElResolver.add(new ArrayELResolver());//添加集合解析器compositeElResolver.add(new ListELResolver());//添加map解析器compositeElResolver.add(new MapELResolver());//添加json格式的数据解析器 like {key:value,...} or [1,2,3,4,...]compositeElResolver.add(new JsonNodeELResolver());//添加bean解析器compositeElResolver.add(new BeanELResolver());return compositeElResolver;}
在ProcessEngineConfigurationImpl.java中调用
public class ProcessEngineFactoryBean implements FactoryBean<ProcessEngine>, DisposableBean, ApplicationContextAware {...protected void configureExpressionManager() {if (processEngineConfiguration.getExpressionManager() == null && applicationContext != null) {processEngineConfiguration.setExpressionManager(new SpringExpressionManager(applicationContext, processEngineConfiguration.getBeans()));}}...
}
使用表达式
Activiti的Expression 接口
public interface Expression extends Serializable {// variableScope 为变量作用域Object getValue(VariableScope variableScope);void setValue(Object value, VariableScope variableScope);String getExpressionText();}
在代码中的具体使用
//获取表达式对象
//execution 为 VariableScope 的实现类 用于从不同的变量作用域中取变量
Expression expression = expressionManager.createExpression("${bean.id}");businessKey = expression.getValue(execution).toString();
为什么有VariableScope
因为Activiti中有很多流程,每一个流程都有很多变量,使用变量的时候肯定不能去拿其他流程的变量,为了更好的管理在表达式中使用变量,所以这里就有了一个变量作用域的概念
通过变量作用域获得EL上下文
public class ExpressionManager {
...public ELContext getElContext(VariableScope variableScope) {ELContext elContext = null;if (variableScope instanceof VariableScopeImpl) {VariableScopeImpl variableScopeImpl = (VariableScopeImpl) variableScope;elContext = variableScopeImpl.getCachedElContext();}if (elContext == null) {//如果没有就创建一个EL上下文elContext = createElContext(variableScope);if (variableScope instanceof VariableScopeImpl) {((VariableScopeImpl) variableScope).setCachedElContext(elContext);}}return elContext;}
...
}
VariableScope 的实现类
实现类就只要有三个类
- NoExecutionVariableScope.java
- TaskEntityImpl.java
- ExecutionEntityImpl.java
其中VariableScopeImpl 是个抽象类,这里使用了模板模式
需要子类实现的方法
protected abstract Collection<VariableInstanceEntity> loadVariableInstances();protected abstract VariableScopeImpl getParentVariableScope();protected abstract void initializeVariableInstanceBackPointer(VariableInstanceEntity variableInstance);protected abstract VariableInstanceEntity getSpecificVariable(String variableName);
JUEL实现类
public class JuelExpression implements Expression {protected String expressionText;protected ValueExpression valueExpression;public JuelExpression(ValueExpression valueExpression, String expressionText) {this.valueExpression = valueExpression;this.expressionText = expressionText;}public Object getValue(VariableScope variableScope) {//获取值的时候都要通过variableScope获取上下文ELContext elContext = Context.getProcessEngineConfiguration().getExpressionManager().getElContext(variableScope);try {ExpressionGetInvocation invocation = new ExpressionGetInvocation(valueExpression, elContext);Context.getProcessEngineConfiguration().getDelegateInterceptor().handleInvocation(invocation);return invocation.getInvocationResult();} catch (PropertyNotFoundException pnfe) {throw new ActivitiException("Unknown property used in expression: " + expressionText, pnfe);} catch (MethodNotFoundException mnfe) {throw new ActivitiException("Unknown method used in expression: " + expressionText, mnfe);} catch (ELException ele) {throw new ActivitiException("Error while evaluating expression: " + expressionText, ele);} catch (Exception e) {throw new ActivitiException("Error while evaluating expression: " + expressionText, e);}}public void setValue(Object value, VariableScope variableScope) {ELContext elContext = Context.getProcessEngineConfiguration().getExpressionManager().getElContext(variableScope);try {ExpressionSetInvocation invocation = new ExpressionSetInvocation(valueExpression, elContext, value);Context.getProcessEngineConfiguration().getDelegateInterceptor().handleInvocation(invocation);} catch (Exception e) {throw new ActivitiException("Error while evaluating expression: " + expressionText, e);}}@Overridepublic String toString() {if (valueExpression != null) {return valueExpression.getExpressionString();}return super.toString();}public String getExpressionText() {return expressionText;}
}
Activiti UEL表达式是如何与Spring 的容器整合起来的相关推荐
- uel表达式 字符串截取_(4)activiti工作流引擎之uel表达式
有了前面几章,我们肯定有一定的困惑,activiti如何与实际业务整合,比如一条采购单,如何跟一个流程实例互相关联起来? 这里就需要使用到activiti启动流程实例时设置一个流程实例的busines ...
- activiti个人任务分配,UEL表达式,监听器分配,任务查询
文章目录 一.个人任务 1..分配任务负责人 1.1.固定分配 1.2.表达式分配 1.2.1.UEL 表达式 1)UEL-value 定义 2)UEL-method 方式 3)UEL-method ...
- 全网最新Spring Boot2.5.1整合Activiti5.22.0企业实战教程<UEL表达式篇>
文章目录 前言 一.表达式分配负责人 1.UEL 表达式 1.部署流程 2.启动流程 3.我的待办 4.执行任务 2.UEL-method 方式 1.创建SpringBean 2.部署流程 3.启动流 ...
- [Activiti] UEL 统一表达式语言 (任务节点 Assignee 通过变量获取)
UEL是java EE6规范的一部分,UEL(Unified Expression Language)即统一表达式语言,activiti支持两个UEL表达式:UEL-value和UEL-method. ...
- [Activiti]UEL(Unified Expression Language)即统一表达式语言
UEL是java EE6规范的一部分,UEL(Unified Expression Language)即统一表达式语言,activiti支持两个UEL表达式:UEL-value和UEL-method. ...
- Activiti(十三)UEL 表达式分配个人任务
当我们画bpmn的时候不指定哪个任务由哪个参与者执行的时候可以使用UEL 表达式分配个人任务 UEL 表达式分配个人任务 步骤: 画bpmn图 代码指定 第一步:画bpmn图 第二步:代码实现 步骤: ...
- Activity的UEL 表达式
Activiti 使用 UEL 表达式,UEL 是 java EE6 规范的一部分,UEL(Unified Expression Language)即统一表达式语言,activiti 支持两个 UEL ...
- uel表达式 字符串截取_activiti工作流引擎之uel表达式
qq讨论群:313032825 本人做了一个微信公众号,用于分享各类视频学习资源和我多年学习经验,喜欢的可以关注哦! 有了前面几章,我们肯定有一定的困惑,activiti如何与实际业务整合,比如一条采 ...
- 工作流中的UEL表达式的使用
公共spring配置文件: Xml代码 <?xml version="1.0" encoding="UTF-8"?> <beans xml ...
最新文章
- Linux EOF使用
- python基础-字符串
- 汽车开放系统架构(AUTOSAR)简介
- python新建文件夹口令_Python 口令保管箱
- 大数据的数据采集数据处理_让我们处理大数据
- wex5中win8或者win10操作系统studio中新建.w向导或其他的编辑窗口显示不全
- 经典编程问题之:选择排序、冒泡排序、汉诺塔游戏,均用js代码实现
- sql 可以多个分组吗_你知道吗?罗非鱼的品种多达100多个,不单是食用鱼也可以是观赏鱼...
- 人工智能 VS 机器学习 VS 深度学习
- SVM实现多分类的三种方案
- 2021年最棒的10款Java框架,你喜欢哪个?
- 基于vlmcsd搭建KMS服务器
- 小学生可以学java编程吗_小学生学编程都要学习哪些内容 家长们知道吗
- 经典运放电路详细分析(模拟电子技术)
- Xilinx 7A 开发流程——工程模式 ARTY XC7A35T
- 前端React下载文件到浏览器
- cocos creator 打包ios 构建失败
- java解析bt协议详解_【转】bt协议的详细分析
- C 语言for的语法规则和for(;;)的解析
- python日常工作_python日常工作 - osc_sd6j22mg的个人空间 - OSCHINA - 中文开源技术交流社区...
热门文章
- 三年级计算机考试题目及答案,三年级信息技术试题及答案.doc
- C_C++圣战(摘录)
- Office EXCEL 表格如何设置某个单元格是选择项,如何设置二级下拉菜单 WPS版
- Idea 使用svn创建新分支
- 铁乐学python-shelve模块详解
- 微软Windows10LTSC2019官方三月更新版镜像
- H264 NALU详解
- java计算机毕业设计vue的高校个性化选课推荐源码+数据库+系统+lw文档+mybatis+运行部署
- Zuul 2 : The Netflix Journey to Asynchronous, Non-Blocking Systems
- 心情低落的时候看一看