springboot整合activiti源码分析,自动化配置

最近研究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实现了自动化配置。


版权声明:本文为lph107原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。