最近研究springboot整合activiti是怎么工作的,看了源码来浅谈自己的理解,如有不对的地方,希望看到这篇文章的朋友帮忙指出来,在此提前谢谢。
1.springboot整合activiti导入jar,我是基于maven创建的,直接引入activiti整合springboot的依赖
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-spring-boot-starter-basic</artifactId>
<version>5.21.0</version>
</dependency>
2.springboot项目启动后,会自动加载类路径下jar包的spring.factories,如下图
3.看到,在springboot项目启动时自动配置了四个configuration,这里我浅谈一下自己对
org.activiti.spring.boot.DataSourceProcessEngineAutoConfiguration 配置类的理解,分析activiti是如何自动配置的。
4.打开 DataSourceProcessEngineAutoConfiguration 配置类,在这个配置类里将SpringProcessEngineConfiguration注册成一个bean组件。
@Bean
@ConditionalOnMissingBean
public SpringProcessEngineConfiguration springProcessEngineConfiguration(DataSource
dataSource, PlatformTransactionManager transactionManager, SpringAsyncExecutor
springAsyncExecutor) throws IOException {
return this.baseSpringProcessEngineConfiguration(dataSource,
transactionManager, springAsyncExecutor);
}
5.SpringProcessEngineConfiguration 继承了ProcessEngineConfigurationImpl,在这个组件里有一个buildProcessEngine()方法,此方法利用父类ProcessEngineConfigurationImpl的buildProcessEngine方法构建了ProcessEngine(activiti流程引擎的核心类)类,接下来我们来看看父类ProcessEngineConfigurationImpl 的buildProcessEngine方法,这个方法有两部操作,一是调用了此类中的init方法,二是返回一个ProcessEngine对象。
public ProcessEngine buildProcessEngine() {
this.init();
return new ProcessEngineImpl(this);
}
6.接下来我们来看看init方法的内容,这个方法初始化了很多的资源,配置、service、DataSource、Jpa等。
protected void init() {
this.initConfigurators();
this.configuratorsBeforeInit();
this.initProcessDiagramGenerator();
this.initHistoryLevel();
this.initExpressionManager();
this.initDataSource();
this.initVariableTypes();
this.initBeans();
this.initFormEngines();
this.initFormTypes();
this.initScriptingEngines();
this.initClock();
this.initBusinessCalendarManager();
this.initCommandContextFactory();
this.initTransactionContextFactory();
this.initCommandExecutors();
this.initServices();
this.initIdGenerator();
this.initDeployers();
this.initJobHandlers();
this.initJobExecutor();
this.initAsyncExecutor();
this.initTransactionFactory();
this.initSqlSessionFactory();
this.initSessionFactories();
this.initJpa();
this.initDelegateInterceptor();
this.initEventHandlers();
this.initFailedJobCommandFactory();
this.initEventDispatcher();
this.initProcessValidator();
this.initDatabaseEventLogging();
this.configuratorsAfterInit();
}
7.在步骤6提到的init方法中,我仅以initServices方法为例简要说一下,其他方法不做说明,感兴趣的朋友可以查看其他initXXX方法。现在类中声明了activiti操作的service属性对象。然后用setter注入的方法将它们注入进来。例runtimeService,其它相同。
public ProcessEngineConfigurationImpl setRuntimeService(RuntimeService runtimeService) { this.runtimeService = runtimeService; return this; }
protected RepositoryService repositoryService = new RepositoryServiceImpl(); protected RuntimeService runtimeService = new RuntimeServiceImpl(); protected HistoryService historyService = new HistoryServiceImpl(this); protected IdentityService identityService = new IdentityServiceImpl(); protected TaskService taskService = new TaskServiceImpl(this); protected FormService formService = new FormServiceImpl();
protected void initServices() {
this.initService(this.repositoryService);
this.initService(this.runtimeService);
this.initService(this.historyService);
this.initService(this.identityService);
this.initService(this.taskService);
this.initService(this.formService);
this.initService(this.managementService);
this.initService(this.dynamicBpmnService);
}
至此activiti实现了自动化配置。