activiti学习8:springboot2.0整合activiti5

本文记录下如何整合activiti5.22.0和springboot2.0.1

因为版本问题,直接使用activiti5提供的activiti-spring-boot-starter-basic是不能整合springboot2.0的。

一、整合原理

springboot应用本质上也是一个spring应用,只不过简化了许多配置,有许多配置工作都通过起步依赖自动进行了。所以不能自动配置的时候我们就可以通过手动配置来完成。回忆下activiti如何和spring整合:在spring的配置文件中依次配置如下的bean

(1)数据源(连接池)

(2)事务管理器(和spring整合后必须配置事务管理器)

(3)流程引擎配置对象,这里可以注入一些流程引擎的配置

(4)流程引擎对象

(5)activiti的服务组件,配置后在程序中可以直接从容器中获取

同样的,在springboot中我们也可以自己手动配置这些bean,让框架帮我们创建这些bean,完成整合,在应用中直接获取这些bean

二、具体实现

首先引入activiti的spring模块的依赖

<dependency>
            <groupId>org.activiti</groupId>
            <artifactId>activiti-spring</artifactId>
            <version>5.22.0</version>
</dependency>

引入这个依赖后就不需要再引入activiti和springboot整合的那个starter了,所有bean的配置全部手动完成。

在springboot中要配置一个bean很简单,可以单独定义一个配置类,也可以直接在启动类中使用@Bean注解进行配置。

(1)连接池,连接池对象可以自己配置一个,也可以直接在启动类中用@Autowired注入springboot提供的

(2)事务管理器,处理方式和连接池一样

(3)流程引擎配置对象:配置activiti的spring模块提供的SpringprocessEngineConfiguration类的对象作为流程引擎配置bean

(4)流程引擎对象:使用activiti的spring模块提供的ProcessEngineFactoryBean,它用来维护一个ProcessEngine实例,向它注入一个流程引擎配置对象,就会自动创建ProcessEngine。在得到spring上下文后,通过getBean方法获取的ProcessEngineFactoryBean的bean,实际上得到的是一个ProcessEngine实例。

(5) 各服务组件可通过流程引擎对象获得

在配置类中具体的配置方式如下

	
@SpringBootApplication
public class ActivitiTestApplication {
    public static void main(String[] args) {
        SpringApplication.run(ActivitiTestApplication.class);
    }

    //事务管理器
    @Autowired
    private PlatformTransactionManager platformTransactionManager;

    //连接池
    @Autowired
    private DataSource dataSource;

    /**
     * 流程引擎配置对象
     * @return
     */
    @Bean
    public SpringProcessEngineConfiguration processEngineConfiguration(){
        SpringProcessEngineConfiguration processEngineConfiguration=new SpringProcessEngineConfiguration();
        processEngineConfiguration.setDataSource(dataSource);
        processEngineConfiguration.setTransactionManager(platformTransactionManager);
        processEngineConfiguration.setDatabaseSchemaUpdate("true");
        processEngineConfiguration.setActivityFontName("宋体");
        processEngineConfiguration.setLabelFontName("宋体");
        return processEngineConfiguration;
    }

    /**
     * 流程引擎对象的bean
     * @param processEngineConfiguration
     * @return
     */
    @Bean
    public ProcessEngineFactoryBean processEngine(@Qualifier("processEngineConfiguration") SpringProcessEngineConfiguration processEngineConfiguration){
        ProcessEngineFactoryBean processEngineFactoryBean=new ProcessEngineFactoryBean();
        processEngineFactoryBean.setProcessEngineConfiguration(processEngineConfiguration);
        return processEngineFactoryBean;
    }

    //以下几个为activiti的服务组件对应的bean
    @Bean
    public RepositoryService repositoryService(@Qualifier("processEngine") ProcessEngine processEngine){
        return processEngine.getRepositoryService();
    }

    @Bean
    public RuntimeService runtimeService(@Qualifier("processEngine") ProcessEngine processEngine){
        return processEngine.getRuntimeService();
    }

    @Bean
    public TaskService taskService(@Qualifier("processEngine") ProcessEngine processEngine){
        return processEngine.getTaskService();
    }

    @Bean
    public IdentityService identityService(@Qualifier("processEngine") ProcessEngine processEngine){
        return processEngine.getIdentityService();
    }

    @Bean
    public HistoryService historyService(@Qualifier("processEngine") ProcessEngine processEngine){
        return processEngine.getHistoryService();
    }
}

这样就完成了springboot2和activiti5的整合,在你的应用中就可以直接注入activiti的各服务组件来使用。