1、每个命令执行前的拦截器有4个:
LogInterceptor;
SpringTransactionInterceptor;
CommandContextInterceptor;
CommandInvoker.其拦截器执行顺序也是以上列出的顺序。
2. 所有命令都是通过
CommandExecutorImpl
的实例来执行的,并依次通过LogInterceptor,SpringTransactionInterceptor,
CommandContextInterceptor,
CommandInvoker这三个命名拦截器,很明显,最后由
CommandInvoker真真开始执行此命令
3.
CommandContextInterceptor中的execute很重要。关键是
CommandContext中的close方法,其中主要包含数据库的大部分操作(插入,更新,删除)。
注意:1. CommandContextInterceptor:主要功能是以当前命令和流程配置信息为基础创建出当前命令的执行上下文,然后将此命令上下文保存在当前线程的stack变量中(即
executionContextStackThreadLocal
)。
总之,命令的执行流程:当前命令链式的依次通过
LogInterceptor,
SpringTransactionInterceptor,接着进入
CommandContextInterceptor,此时它将当前命令和
ProcessEngineConfigurationImpl的实例结合起来组成
CommandContext对象,并将其保存在类Context的静态类型的ThreadLocal变量中的stack中。接着由
CommandInvoker
去真真执行该命令,命令执行完后返回到
CommandContextInterceptor中,接着执行
context.close()完成相关数据库操作。最终事务交给spring管理(此处是与spring结合的)。