使用场景
每个对流程的操作都可以看成一个命令command,Activiti会对每个命令进行拦截处理,Activiti的命令拦截用到了命令模式和责任链模式,
命令模式的本质在于将命令进行封装,发出命令和执行命令分离;
职责链模式只需要将请求放入职责链上,其处理细节和传递都不需要考虑;
执行入口
commandExecutor是命令执行的入口。
在命令来临时,service会调用commandExecutor的execute方法,例如runtimeService。所以commandExecutor是命令执行的第一步。
那么Activiti是什么时候给service注入commandExecutor的呢?
在ProcessEngineConfigurationImpl中init方法中会initServices,其又在初始化的时候注入commandExecutor,源码如下:
命令模式的表现
上面分析了命令执行的第一步,就是调用CommandExecutor.execute方法,然后我们跟踪去看这个execute方法,在子类CommandExecutorImpl中看到了实际的调用。
public class CommandExecutorImpl implements CommandExecutor {
protected CommandConfig defaultConfig;
protected CommandInterceptor first;//拦截器
public CommandExecutorImpl(CommandConfig defaultConfig, CommandInterceptor first) {
this.defaultConfig = defaultConfig;
this.first = first;
}
public CommandInterceptor getFirst() {
return first;
}
public void setFirst(CommandInterceptor commandInterceptor) {
this.first = commandInterceptor;
}
@Override
public CommandConfig getDefaultConfig() {
return defaultConfig;
}
@Override
public <T> T execute(Command<T> command) {
return execute(defaultConfig, command);
}
@Override
public <T>