Activiti6 Spring的加载

最近在使用Acticiti6时一直怀疑Activiti6是怎么样和Spring做整合的,以下是通过查看源码得到的思路

通过查看官网文档发现其初始化的核心是ProcessEngine类,于是我们在activiti-spring包中全局搜索,发现在资源目录下

Activiti6 Spring的加载_第1张图片

查找到配置文件,里面Spring初始化的xml,主要的配置如下

Activiti6 Spring的加载_第2张图片

进入ProcessEngineFactoryBean,发现其是通过实现Spring的FactoryBean接口来完成初始化

 

由FactoryBean方法的 getObject()方法来生成ProcessEngineActiviti6 Spring的加载_第3张图片

 

那么ProcessEngine具体是如何生成的呢?我们可以根据Spring的配置文件进入 ProcessEngine的processEngineConfiguration中看下里面实现了什么

进入后发现其本质为processEngineConfiguration的实现类,而ProcessEngineConfigurationImpl又是在xml文件中注入的,里面包含了一些activiti默认的配置,接下来代码会执行ProcessEngineFactoryBean下面的getObject()方法来生成ProcessEngine

Activiti6 Spring的加载_第4张图片

而getObject()方法是Spring开放的接口针对复杂对象初始化而使用的,本质上和xml中编写bean文件和用注解方式完成注入差不多,实现完该接口只需要在用bean方式或者用注解方式在Spring容器中注册即可,Spring会根据getObject()方法来生成对象,且默认是单例模式生成,可通过重写 isSingleton()来改变

Activiti6 Spring的加载_第5张图片

我们现在也许还是会疑问我们日常使用中的各种Service是如何初始化的呢,我们如图进去进入ProcessEngine的以下方法

发现返回的ProcessEngine其实是ProcessEngineImpl类

Activiti6 Spring的加载_第6张图片

 

其构造传入了ProcessEngineConfigurationImpl这个类就是我们之前在xml中看见的默认配置的类,我们现在进去其构造方法

Activiti6 Spring的加载_第7张图片

发现其初始化了我们日常所用的各种service,我们以RuntimeService为例发现其返回的是ProcessEngineConfigurationImpl初始化new的一个RuntimeService

Activiti6 Spring的加载_第8张图片

到现在所有的Service都已经初始化完毕,并通过Spring xml中的

Activiti6 Spring的加载_第9张图片

工厂构成方法完成初始化,

到现在我们也许还会以为那么这些Service到底又是怎么执行的呢?我们进入一个service,这里还是以RuntimeService为例,

Activiti6 Spring的加载_第10张图片

我们发现其实内部是有一个commandExecutor的命令执行器,其是父类ServiceImpl的一个属性

Activiti6 Spring的加载_第11张图片

那也许我们这里又会疑问,这个CommandExecutor又是在哪里初始化的呢?我们之前都没看见啊

其实这些方法都在ProcessEngineConfigurationImpl中我们进入ProcessEngineConfigurationImpl方法,其中有一个CommandExecutor属性这个就是执行器,接着我们往下找

Activiti6 Spring的加载_第12张图片

发现如图的红色框中初始化了执行器代码,继续进入

Activiti6 Spring的加载_第13张图片

其本质是一个CommandExecutorImpl,

那这个CommandExecutorImpl又是如何注入各种Service的呢?答案在以下方法中。

Activiti6 Spring的加载_第14张图片

 

你可能感兴趣的:(activiyi6)