购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

3.3 Spring及Flowable原理

本节的内容将从原理角度解析Spring及Flowable,初学者可跳过该部分内容,需要时再回来翻阅。

开发中,我们一直能看到Spring,一直在使用Spring。那么,什么是Spring?为什么要集成Spring?说到Spring,大家自然想到它的两个特性,控制反转(IOC)和面向切面编程(AOP),但这两个特性并不是它的本质。Spring的本质是容器,作为应用中构成程序主干对象的管理容器,Spring将主干对象资源集中管理,可以理解为对象的管理工作被统一封装成了一个框架,过去传统的对象直接使用方式变成通过Spring框架调用对象的方式,即控制反转。这样做的好处是明显的:

(1)实现资源的可配置化,易于管理。

(2)降低使用资源双方的依赖,松耦合,解决对象依赖等问题。

3.3.1 Spring构建过程

图3.7是Spring原理图,其中bean是Spring运行时管理的对象。Spring的工作过程是:首先构建Spring IOC容器,然后bean读取器根据配置文件读取bean定义信息,接着使用反射实例化bean,随后动态代理控制初始化bean过程,最后生成完整bean对象。下面对各流程进行介绍。

(1)bean对象描述信息,即bean配置文件。常见的bean配置文件格式有XML、YAML、JSON。

(2)bean对象定义读取器,是定义读取配置文件的接口设计规范,不同格式的配置文件读取都需实现该接口。

(3)bean定义信息,由bean对象定义读取器读取bean配置文件生成,属于IOC容器的起点。

图3.7 Spring原理图

(4)实例化bean,就是在堆中开辟一块空间,创建属性都是默认值的对象,这个过程由反射完成。

(5)初始化bean,初始化的工作是填充属性,调用具体的初始化方法。这个过程由动态代理控制,在具体初始化方法的前后都有后置处理器,即before()和after()方法,这两个方法是实现AOP的关键。

(6)完整bean对象,由上面步骤即可创建完整bean对象,其中实例化bean、初始化bean外加销毁过程构成了bean的生命周期。

3.3.2 Flowable流程引擎构建过程

与Spring类似,Flowable流程引擎也是经由配置文件→读取配置→实例化对象→初始化对象的步骤创建的。

而Flowable流程引擎本质上也是一个对象,交由Spring IOC容器管理。通过Flowable源码BeansConfigurationHelper类中方法可以知道,Flowable将自身配置文件中定义的bean全部交由Spring容器管理,包括配置、加载和获取操作。BeansConfigurationHelper代码如下:

Flowable流程引擎构造过程如图3.8所示,主要包括:Spring根据Flowable配置文件创建Flowable流程引擎对象,Flowable流程引擎初始化后,注册到FlowableEngines管理类。

图3.8 Flowable流程引擎构造过程

从图3-8中的构造过程可以看出,由于配置文件是起点,因此流程引擎为开发人员提供了一系列扩展点,这些扩展点都可以通过流程引擎配置类进行操作。先来看配置文件,配置文件可以分为两种:Flowable风格的配置文件flowable.cfg.xml和Spring风格的配置文件flowable-context.xml,两种配置文件,两种配置文件的本质还是Spring配置,都需放置在classpath文件夹下。

注意,如果使用flowable-context.xml配置文件,则一定要定义流程引擎类,即定义ID为“processEngine”的bean,否则会报错。

当配置文件被读取后,会生成流程引擎配置类,进行一系列初始化工作。在实际开发中,如果初始化方法不能满足业务需求,则可以自定义继承类Standalone ProcessEngineConfiguration(对应flowable.cfg.xml)或者SpringProcessEngine Configuration(对应flowable-context.xml),重写初始化方法。

3.3.3 Flowable引擎配置

配置文件是常用方法,其存在以下两个缺点。

(1)不灵活,所有的信息都需配置在XML类型文档中。

(2)无法动态配置,不能使用编程方式构造流程引擎配置类。

为了克服上述缺点,Flowable引擎增加了配置器,可以通过编程的方式动态修改或刷新流程引擎配置类实例对象的属性值。所有的配置器都需实现ProcessEngine Configurator接口,并将其注入到流程引擎配置中,具体代码如下:

ProcessEngine Configurator接口需要实现3个方法。

(1)beforeInit()方法:使用ProcessEngineConfiguration实例作为参数,在完成任何初始化之前调用。例如jdbc url,当实例想要更改它时,需要使用此方法,否则数据源就已经创建了。

(2)configure()方法:同样使用ProcessEngineConfiguration实例作为参数,可以在此方法里添加自定义配置,并且这个方法会保证当流程引擎启动时在内部对象初始化完成之后被调用。这种方法的一个例子是集成LDAP,使用配置器将默认的用户与组管理类替换为可以处理LDAP用户的实现。可见配置器能相当大程度地改变及调整流程引擎以适应高级的使用场景。另一个例子是使用自定义缓存替换流程引擎缓存,具体代码如下:

(3)getPriority()方法:可以指定配置器的优先级,适合实例间有依赖需要排序的情况。优先级默认值为10000,从低到高排序。 A0dBRMVk5zacAOvH3M0IFX5+vc46kF5h2YSr2M3OQfd+Rh/S3h3ckmTJ9PqqBtVX

点击中间区域
呼出菜单
上一章
目录
下一章
×