Activiti6 Spring的加载
最近在使用Acticiti6时一直怀疑Activiti6是怎么样和Spring做整合的,以下是通过查看源码得到的思路
通过查看官网文档发现其初始化的核心是ProcessEngine类,于是我们在activiti-spring包中全局搜索,发现在资源目录下
查找到配置文件,里面Spring初始化的xml,主要的配置如下
进入ProcessEngineFactoryBean,发现其是通过实现Spring的FactoryBean接口来完成初始化
由FactoryBean方法的 getObject()方法来生成ProcessEngine
那么ProcessEngine具体是如何生成的呢?我们可以根据Spring的配置文件进入 ProcessEngine的processEngineConfiguration中看下里面实现了什么
进入后发现其本质为processEngineConfiguration的实现类,而ProcessEngineConfigurationImpl又是在xml文件中注入的,里面包含了一些activiti默认的配置,接下来代码会执行ProcessEngineFactoryBean下面的getObject()方法来生成ProcessEngine
而getObject()方法是Spring开放的接口针对复杂对象初始化而使用的,本质上和xml中编写bean文件和用注解方式完成注入差不多,实现完该接口只需要在用bean方式或者用注解方式在Spring容器中注册即可,Spring会根据getObject()方法来生成对象,且默认是单例模式生成,可通过重写 isSingleton()来改变
我们现在也许还是会疑问我们日常使用中的各种Service是如何初始化的呢,我们如图进去进入ProcessEngine的以下方法
发现返回的ProcessEngine其实是ProcessEngineImpl类
其构造传入了ProcessEngineConfigurationImpl这个类就是我们之前在xml中看见的默认配置的类,我们现在进去其构造方法
发现其初始化了我们日常所用的各种service,我们以RuntimeService为例发现其返回的是ProcessEngineConfigurationImpl初始化new的一个RuntimeService
到现在所有的Service都已经初始化完毕,并通过Spring xml中的
工厂构成方法完成初始化,
到现在我们也许还会以为那么这些Service到底又是怎么执行的呢?我们进入一个service,这里还是以RuntimeService为例,
我们发现其实内部是有一个commandExecutor的命令执行器,其是父类ServiceImpl的一个属性
那也许我们这里又会疑问,这个CommandExecutor又是在哪里初始化的呢?我们之前都没看见啊
其实这些方法都在ProcessEngineConfigurationImpl中我们进入ProcessEngineConfigurationImpl方法,其中有一个CommandExecutor属性这个就是执行器,接着我们往下找
发现如图的红色框中初始化了执行器代码,继续进入
其本质是一个CommandExecutorImpl,
那这个CommandExecutorImpl又是如何注入各种Service的呢?答案在以下方法中。