在之前的一篇文章中,介绍了Soringboot2与activiti7整合,本文我们看下整合后的activiti7是如何初始化的,以及相关Bean如何注入。

配置和创建工作流引擎

首先第一个问题,activiti7的初始化工作是怎么启动呢?我得从盘古开天辟地说起,顺便复习下Springboot相关知识。

Springboot的main函数上有个注解@SpringBootApplication,我们看下这个注解的的实现,只看关键部分:

在这段代码中有一个关键的注解@EnableAutoConfiguration,这个注解的作用是顾名思义的就是允许自动配置,怎么实现呢,继续看@EnableAutoConfiguration的源码:

在这段代码中,@Import({AutoConfigurationImportSelector.class})的作用是将AutoConfigurationImportSelector这个类注册为Bean交给容器管理。这个类里面有个关键方法public String[] selectImports(AnnotationMetadata annotationMetadata)``,作用是扫描所有包(包含依赖jar包)中的``META-INF/spring.factories``文件,把其中key为"...EnableAutoConfiguration"对应的value里的类都加载为Bean。

看下activiti-spring-boot-starter这个包中spring.factories文件的内容:

所以,这个文件里面的三个类都被加载为Bean。即EndpointAutoConfiguration,ProcessEngineAutoConfiguration,ActivitiMethodSecurityAutoConfiguration这三个。这就是Springboot的自动配置原理。总结起来就是@EnableAutoConfiguration会自动扫描所有包下面的META-INF/spring.factories文件,将其中key以EnableAutoConfiguration结尾的对应的value的类全部加载为Bean。这就是SPI机制,与JDK中的SPI和DUBBO的SPI类似,但是具体实现方法不一样。关于SPI我之后会详细讲解。

我们关注ProcessEngineAutoConfiguration这个Bean,其余两个以后再解释。

看下ProcessEngineAutoConfiguration这个类部分的源码:

这个类主要作用的就是流程引擎的配置,注解@EnableConfigurationProperties({ActivitiProperties.class, AsyncExecutorProperties.class})会将在properties中的配置属性映射到对应的类的属性中去。例如常用的在application-dev.properties配置的database-schema-update,history-level,db-history-used等属性就是在这里被映射到类ActivitiProperties中去的,然后在SpringProcessEngineConfiguration springProcessEngineConfiguration()方法中添加到引擎配置类中的。

ProcessEngineAutoConfiguration中会注册很多Bean,其中有个比较重要:

SpringProcessEngineConfiguration这个Bean主要负责流程引擎的配置,将数据源和Springboot配置文件中配置的activiti7的相关属性配置到引擎中去。这个Bean被注解@ConditionalOnMissingBean修饰,意思是只有在容器中不存在SpringProcessEngineConfiguration的情况下这个Bean才会被注册,因此如果要自定义自己的引擎配置,重新定义一个SpringProcessEngineConfiguration类型的Bean即可。

ProcessEngineAutoConfiguration继承了AbstractProcessEngineAutoConfiguration,这个抽象类里面定义了几个比较重要的Bean:

ProcessEngineFactoryBean这个Bean的主要作用产生ProcessEngine Bean,可以理解为是产生Bean的Bean,比较拗口。这个Bean实现了FactoryBean接口,FactoryBean接口是spring里面一个接口,与它长得比较类似的事BeanFactory,它们作用完全不一样。FactoryBean是一个工厂Bean,可以生成某一个类型Bean实例,它最大的一个作用是:可以让我们自定义Bean的创建过程。BeanFactory是一个接口,它是Spring中工厂的顶层规范,是SpringIoc容器的核心接口,它定义了getBean()、containsBean()等管理Bean的通用方法。Spring的容器都是它的具体实现,它负责管理所有的Bean,包括FactoryBean。

上面说到FactoryBean可以让我们自定义Bean的创建过程,那么怎么定义呢,方法很简单,只要实现FactoryBean的getObject方法即可。看下ProcessEngineFactoryBean中getObject的实现:

这里返回的类型也就是这个ProcessEngineFactoryBean产生的Bean即为Processengine。说了这么多,可以简单概括为ProcessEngineFactoryBean主要是负责产生一个Processengine,实现引擎Bean的注入。

这个抽象类中还注入了其他常用的Bean,例如RuntimeService,RepositoryService,HistoryService,TaskService等。

与这个过程类似,在初始化的时候还加载了许多其他类型的Bean。

在ProcessEngineFactoryBean的getObject方法是为了创建Processengine,其中最关键的代码:

this.processEngine = this.processEngineConfiguration.buildProcessEngine();跟进去看这里的buildProcessEngine()的具体实现:

其中的this.autoDeployResources(processEngine);会在项目启动的时候将classpath:*/processes/``目录下的流程图自动部署。可以通过``spring.activiti.deployment-mode``这个属性设置各种不同的部署策略。

这次先讲到这里,下次介绍下activiti7的命令模式。

bean 属性设置默认值_activiti7源码分析之引擎初始化与Bean注入相关推荐

  1. Spring IOC 容器源码分析 - 余下的初始化工作

    1. 简介 本篇文章是"Spring IOC 容器源码分析"系列文章的最后一篇文章,本篇文章所分析的对象是 initializeBean 方法,该方法用于对已完成属性填充的 bea ...

  2. linux源码分析之cpu初始化 kernel/head.s,linux源码分析之cpu初始化

    linux源码分析之cpu初始化 kernel/head.s 收藏 来自:http://blog.csdn.net/BoySKung/archive/2008/12/09/3486026.aspx l ...

  3. celery源码分析-Task的初始化与发送任务

    celery源码分析 本文环境python3.5.2,celery4.0.2,django1.10.x系列 celery的任务发送 在Django项目中使用了装饰器来包装待执行任务, from cel ...

  4. nginx源码分析之模块初始化

    在nginx启动过程中,模块的初始化是整个启动过程中的重要部分,而且了解了模块初始化的过程对应后面具体分析各个模块会有事半功倍的效果.在我看来,分析源码来了解模块的初始化是最直接不过的了,所以下面主要 ...

  5. nginx源码分析之网络初始化

    nginx作为一个高性能的HTTP服务器,网络的处理是其核心,了解网络的初始化有助于加深对nginx网络处理的了解,本文主要通过nginx的源代码来分析其网络初始化. 从配置文件中读取初始化信息 与网 ...

  6. mysql源码分析——InnoDB引擎启动分析

    一.InnoDB启动 在MySql中,InnoDB的启动流程其实是很重要的.一些更细节的问题,就藏在了这其中.在前面分析过整个数据库启动的流程,本篇就具体分析一下InnoDB引擎启动所做的各种动作.在 ...

  7. android 系统复位(Reset 恢复出厂设置)9.0源码分析

    今天来从源码的角度 分析一下android 系统复位的流程 1. 从点击 Reset 看起.点击Reset后,会弹出Erase everything.故而从在Setting中搜索此字段开始. 因为我这 ...

  8. jQuery 2.0.3 源码分析Sizzle引擎 - 解析原理

    声明:本文为原创文章,如需转载,请注明来源并保留原文链接Aaron,谢谢! 先来回答博友的提问: 如何解析 div > p + div.aaron input[type="checkb ...

  9. nginx源码分析—模块及其初始化

    Content 0. 序 1. nginx有哪些模块? 2. nginx如何描述这些模块? 2.1 模块数据结构 2.1.1 ngx_module_t结构 2.1.2 ngx_command_t结构 ...

最新文章

  1. 批量修改文件权限 和所有者 chown nobody:nobody * -R chmod 775 * -R
  2. 为什么我不在微信公众号上写文章
  3. WSL的openssh-server使用报错:Could not load host key: /etc/ssh/ssh_host_rsa_key
  4. Lua 性能相关笔记
  5. 一个python程序员需要掌握的知识-python初学者搭建网站需要了解的基础知识
  6. ssr pac_阴阳师新SSR千姬什么时候上线 ssr千姬活动上线时间一览
  7. 如何用python写脚本_【按键教程】用python写脚本 另附垫材24与变奏22的实现
  8. linux编译安装madam,linux 下 使用 mdadm 创建阵列
  9. MySQL 类型转换
  10. 架构师之路(1)---面向过程和面向对象
  11. 横向扩展你的ASP.NET Core SignalR 应用
  12. Java零基础并发编程入门
  13. 简明批处理教程(2)
  14. 三、MQTT Windosw下的 进一步调试
  15. shell 脚本返回上级目录_cmd返回上级目录
  16. matlab 图像分割
  17. 计算机组成原理不恢复余数法,计算机组成原理第八讲(除法-补码不恢复余数法)(科大罗克露)...
  18. 02333软件工程_201910_试卷+答案
  19. 微信跳转APP最全解析
  20. 观《五星大饭店》有感

热门文章

  1. 音视频技术开发周刊 56期
  2. 利用Simple-RTMP-Server搭建RTMP和HLS直播服务(上)
  3. webrtc一对一通话
  4. 万字长文带你深入浅出 Golang Runtime
  5. c++中使用 hiredis/hiredis.h
  6. OpenShift安装
  7. 史上最复杂业务场景,逼出阿里高可用三大法宝
  8. redis3集群部署
  9. 浅析请求转发和重定向
  10. dart系列之:在dart中使用生成器