2023最新版本Activiti7系列-源码篇-初始化过程

2023-11-12

在这里插入图片描述

源码分析

在这里插入图片描述

1.设计模式

1.1 命令模式

https://dpb-bobokaoya-sm.blog.csdn.net/article/details/89115420
在这里插入图片描述

1.2 责任链模式

https://dpb-bobokaoya-sm.blog.csdn.net/article/details/89077040

2.初始化过程

在这里插入图片描述

2.1 入口代码

  我们在SpringBoot项目中来看Activiti7的源码。首先要找到的是自动装配的入口。在activiti-spring-boot-starterspring.factories中找到自动配置类ProcessEngineAutoConfiguration这个配置类

在这里插入图片描述

  进入到ProcessEngineAutoConfiguration中可以看到完成了SpringProcessEngineConfiguration的注入。我们再进入父类AbstractProcessEngineAutoConfiguration中。

    @Bean
    public ProcessEngineFactoryBean processEngine(SpringProcessEngineConfiguration configuration) {
        return super.springProcessEngineBean(configuration);
    }

看到了ProcessEngineFactoryBean这让我们联想到了是getObject()方法。然后进入到springProcessEngineBean方法中。

    public ProcessEngineFactoryBean springProcessEngineBean(SpringProcessEngineConfiguration configuration) {
        ProcessEngineFactoryBean processEngineFactoryBean = new ProcessEngineFactoryBean();
        processEngineFactoryBean.setProcessEngineConfiguration(configuration);
        return processEngineFactoryBean;
    }

再进入到ProcessEngineFactoryBeangetObject方法

    public ProcessEngine getObject() throws Exception {
        this.configureExpressionManager();
        this.configureExternallyManagedTransactions();
        if (this.processEngineConfiguration.getBeans() == null) {
            this.processEngineConfiguration.setBeans(new SpringBeanFactoryProxyMap(this.applicationContext));
        }

        this.processEngine = this.processEngineConfiguration.buildProcessEngine();
        return this.processEngine;
    }

关键是processEngineConfiguration.buildProcessEngine();这行代码。进入buildProcessEngine方法中查看。即进入到了ProcessEngineConfigurationImpl类中,并且调用了下面的方法。

  @Override
  public ProcessEngine buildProcessEngine() {
    init();
    ProcessEngineImpl processEngine = new ProcessEngineImpl(this);
    postProcessEngineInitialisation();

    return processEngine;
  }

ProcessEngineConfigurationImpl的作用:配置和初始化Activiti的流程引擎。通过该类,可以对流程引擎的各种参数进行配置,包括数据库连接信息事务管理器缓存管理器作业执行器等。同时,该类还提供了创建和获取ProcessEngine实例的方法,用于启动和管理流程引擎的运行。

2.2 init方法

  init()方法的作用是初始化Activiti引擎的配置,为引擎的正常运行做准备。

public void init() {
  initConfigurators();
  configuratorsBeforeInit();
  initHistoryLevel();
  initExpressionManager();

  if (usingRelationalDatabase) {
    initDataSource();
  }

  initAgendaFactory();
  initHelpers();
  initVariableTypes();
  initBeans();
  initScriptingEngines();
  initClock();
  initBusinessCalendarManager();
  initCommandContextFactory();
  initTransactionContextFactory();
  initCommandExecutors();
  initServices();
  initIdGenerator();
  initBehaviorFactory();
  initListenerFactory();
  initBpmnParser();
  initProcessDefinitionCache();
  initProcessDefinitionInfoCache();
  initKnowledgeBaseCache();
  initJobHandlers();
  initJobManager();
  initAsyncExecutor();

  initTransactionFactory();

  if (usingRelationalDatabase) {
    initSqlSessionFactory();
  }

  initSessionFactories();
  initDataManagers();
  initEntityManagers();
  initHistoryManager();
  initJpa();
  initDeployers();
  initDelegateInterceptor();
  initEventHandlers();
  initFailedJobCommandFactory();
  initEventDispatcher();
  initProcessValidator();
  initDatabaseEventLogging();
  configuratorsAfterInit();
}

上面初始化的内容有很多。我们先来看几个关键的:

  • initCommandContextFactory();
  • initTransactionContextFactory();
  • initCommandExecutors();
  • initServices();

2.2.1 initCommandContextFactory

  initCommandContextFactory方法的作用很简单,完成ProcessEngineConfigurationImpl中的commandContextFactory属性的初始化操作。

public void initCommandContextFactory() {
  if (commandContextFactory == null) {
    commandContextFactory = new CommandContextFactory();
  }
  commandContextFactory.setProcessEngineConfiguration(this);
}

2.2.2 initTransactionContextFactory

  initTransactionContextFactory方法的作用也很简单,完成ProcessEngineConfigurationImpl中的transactionContextFactory属性的初始化操作。

public void initTransactionContextFactory() {
  if (transactionContextFactory == null) {
    transactionContextFactory = new StandaloneMybatisTransactionContextFactory();
  }
}

2.2.3 initCommandExecutors

  initCommandExecutors这是一个非常重要的方法。会完成责任链中相关拦截器的组织和加载。里面的方法有

  • initDefaultCommandConfig() :初始化defaultCommandConfig属性【可重用Context上下文,支持事务传播属性】
  • initSchemaCommandConfig() :初始化schemaCommandConfig属性【不可重用Context上下文,不支持事务传播属性】
  • initCommandInvoker() :初始化commandInvoker属性。这个是责任链路中的最后一个节点
  • initCommandInterceptors() :初始化commandInterceptors属性,组装所有的拦截器到集合中
  • initCommandExecutor():初始化commandExecutor属性,完成责任链的关联并绑定链路的第一个节点【first】

核心代码:

public void initCommandExecutor() {
  if (commandExecutor == null) {
      // 获取责任链中的第一个拦截器    初始化责任链
    CommandInterceptor first = initInterceptorChain(commandInterceptors);
    commandExecutor = new CommandExecutorImpl(getDefaultCommandConfig(), first);
  }
}

public CommandInterceptor initInterceptorChain(List<CommandInterceptor> chain) {
  if (chain == null || chain.isEmpty()) {
    throw new ActivitiException("invalid command interceptor chain configuration: " + chain);
  }
    // 设置责任链
  for (int i = 0; i < chain.size() - 1; i++) {
    chain.get(i).setNext(chain.get(i + 1));
  }
  return chain.get(0); // 返回第一个节点
}

对应的图解:

在这里插入图片描述

2.2.4 initServices

  在Activiti7中我们完成各种流程的操作,比如部署查询流程定义流程审批等各种操作都是通过xxxService来完成的。这些service在ProcessEngineConfigurationImpl中的成员变量中就会完成对象的实例化。

  protected RepositoryService repositoryService = new RepositoryServiceImpl();
  protected RuntimeService runtimeService = new RuntimeServiceImpl();
  protected HistoryService historyService = new HistoryServiceImpl(this);
  protected TaskService taskService = new TaskServiceImpl(this);
  protected ManagementService managementService = new ManagementServiceImpl();
  protected DynamicBpmnService dynamicBpmnService = new DynamicBpmnServiceImpl(this);

  在init方法的initServices完成的操作是和上面实例化的commandExecutor完成绑定。也就是xxxService中的各种执行操作最终都是由commandExecutor来完成的。

  public void initServices() {
    initService(repositoryService);
    initService(runtimeService);
    initService(historyService);
    initService(taskService);
    initService(managementService);
    initService(dynamicBpmnService);
  }

绑定commandExecutor

  public void initService(Object service) {
    if (service instanceof ServiceImpl) {
      ((ServiceImpl) service).setCommandExecutor(commandExecutor);
    }
  }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

2023最新版本Activiti7系列-源码篇-初始化过程 的相关文章

随机推荐

  • MySQL中的主键约束和外键约束

    1 主键约束 表通常具有包含唯一标识表中每一行的值的一列或一组列 这样的一列或多列称为表的主键 PK 用于强制表的实体完整性 由于主键约束可保证数据的唯一性 因此经常对标识列定义这种约束 如果为表指定了主键约束 数据库引擎将通过为主键列自动
  • xenomai内核解析--xenomai实时线程创建流程

    版权声明 本文为本文为博主原创文章 未经同意 禁止转载 如有错误 欢迎指正 博客地址 https blog csdn net qq 22654551 type blog 文章目录 问题概述 1 libCobalt中调用非实时POSIX接口
  • 二分查找——给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。

    使用时间复杂度为 O log n 的算法 解题思路 1 在右区间时将left mid 1 而左区间时确实right mid 而不是right mid 1 因为我们不是在找某个值得位置 而是找在哪两个数之间 所以用right mid 最后ri
  • Unity3D 对于在VR中普通摄像头和VR摄像头同时存在——分屏

    这两天在研究关于VR的分屏 由于甲方要求需要在VR运行时 有多个一般的摄像头像监控一样定点存在场景中 而且能同时在屏幕上看到 我查了很多资料 并没有查到相关特别好的资料 只能找到如下的解决方案 解决方案 1 首先 VR摄像头和一般摄像头并不
  • 神奇字符串

    一个神奇字符串S仅包含 1 和 2 并遵守以下规则 字符串S是神奇的 因为连接字符 1 和 2 的连续出现次数会产生字符串S本身 字符串S的前几个元素如下 S 1221121221221121122 如果我们将S中的连续 1 和 2 分组
  • maven报错:[ERROR] 不再支持源选项 7。请使用 8 或更高版本。

    解决方案 pom xml文件中增加maven编译的java version jdk版本设置 以及maven compiler source 资源编译jdk版本设置和maven compiler target 资源构建jdk版本设置 JDK
  • 如何转行Python,以工作为导向可能会学的更快

    我是一个曾经做摄影行业的学生 后来转行做计算机 选择了Python 现在已经做了五年Python 月薪38k 因为我也是转行来学习Python的 所以有很多宝贵的经验给大家提供 因为转行并不是一个容易的事情 但是耐不住Python现在的工资
  • Android中的webview监听每次URL变化

    通过这个可以监听Android中webview访问的URL变化 webView setWebViewClient new WebViewClient Override public void onLoadResource WebView v
  • SpringBoot 的 MyBatis 多数据源配置

    实验环境 JDK 1 8 SpringBoot 2 4 1 Maven 3 6 3 MySQL 5 7 因为我本地只有 MySQL 数据库 为了方便演示 我会在启动一个本地 MySQL 在 MySQL 创建两个数据库 每个库中均有一个表 以
  • 关于SQL Server 输入SQL语句不能自动提示的处理方案

    打开 配置工具 SQL Server 配置管理器 看到安装sql server时输入的名称MYSQLSERVER 服务已停止 需启动服务 并将启动模式设置为自动
  • qt中选择文件夹中的中文路径的问题

    参考博客 https blog csdn net m0 37906001 article details 76672634 转换为char 使用的时候 QString fileName1 fileName1 toStdWString c s
  • 自制黑科技------桌面整理工具

    桌面文件太多 找不到文件 通过使用程序 科学的区域划分和文件归类 帮你的桌面变得更整齐 提高你的使用效率 附上桌面图片一张 点击打开链接
  • BottomNavigationView与Navigation使用

    目录 1 as自动生 2 xml代码 如果要修改底部的图标和文字需要去bottom nav menu修改 如果你要修改默认点击颜色需要去主题颜色修改 如果你要修改底部背景颜色可以在BottomNavigationView 的背景颜色修改 如
  • QFile的文件清空操作

    QFile file etc wpa supplicant conf file open QIODevice ReadOnly QTextStream io file file close file open QIODevice Trunc
  • ARM第五章平时作业

    第 5 章 S3C2440 嵌入式系统 共 63 分 一 简述启动代码存储在 NAND Flash 存储器上时 S3C2440 的启动过程 6 分 为了支持 NAND Flash 的 boot loader S3C2440A 配备了一个内部
  • java环境变量配置详细教程

    1 什么是环境变量 环境变量 environment variables 一般是指在操作系统中用来指定操作系统运行环境的一些参数 如 临时文件夹位置和系统文件夹位置等 环境变量是在操作系统中一个具有特定名字的对象 它包含了一个或者多个应用程
  • Java 访问权限 内部类总结

    在Java中 可以将一个类定义在另一个类里面或者一个方法里边 这样的类称为内部类 广泛意义上的内部类一般包括四种 成员内部类 局部内部类 匿名内部类 静态内部类 1 成员内部类 1 该类像是外部类的一个成员 可以无条件的访问外部类的所有成员
  • Java桥接模式

    基本介绍 1 桥接模式 Bridge模式 是指 将实现与抽象放在两个不同的类层次中 使两个层次可以独立改变 2 是一种结构型设计模式 3 Bridge模式基于类的最小设计原则 通过使用封装 聚合及继承等行为让不同的类承担不同的职责 它主要特
  • vue2 维护状态key的作⽤和原理

    1 key定义 为了给 Vue 个提示 以便它能跟踪每个节点的身份 从 重 和重新排序现有元素 你需要为每项提供 个唯 key 2 写法 li item name li 3 作 key 值使 数组的索引index 或者不加 在数组元素顺序打
  • 2023最新版本Activiti7系列-源码篇-初始化过程

    源码分析 1 设计模式 1 1 命令模式 https dpb bobokaoya sm blog csdn net article details 89115420 1 2 责任链模式 https dpb bobokaoya sm blog