编辑推荐

适读人群:JavaWeb应用开发人员,计算机及相关专业在校生
  

  1.内容深入。书中的案例不仅仅讲解Activiti的功能,更模仿Activiti的思路去模拟功能的实现,读者可以深入了解其中的原理。

  2.开发环境与案例更贴近实际。书中案例的开发环境、使用的框架以及工具均是来自企业的实际应用,案例的选取与研发过程更贴近实际。

  3.注释详细。《疯狂工作流讲义 基于Activiti 6.x的应用开发》的代码,几乎每行Java代码均有注释,读者可以很容易地了解代码的意思,轻松掌握相应的知识。


  

内容简介

  

  工作流引擎Activiti经过多年的发展,已经变成一个成熟的工作流框架,在2017年,Activiti推出了全新的6.0版本,除了完善对BPMN规范的支持外,还加入了对DMN规范的支持。为了能让广大的程序开发者一探新版本Activiti的功能,笔者在第一版的基础上,编写了《疯狂工作流讲义 基于Activiti 6.x的应用开发》的第二版。

  书中会对Activiti的知识进行全面讲解,并从源码角度对Activiti进行深度剖析。《疯狂工作流讲义 基于Activiti 6.x的应用开发》会以Activiti为基础,讲述该框架的API使用、BPMN规范,除了这些工作流的基本知识外,还讲解了新的DMN规范引擎、Activiti整合SpringBoot等内容。在《疯狂工作流讲义 基于Activiti 6.x的应用开发》的第18章,深入Activiti的源代码,展示舍弃流程虚拟机(PVM)之后的Activiti,如何对流程进行控制,让读者能一窥Activiti的庐山真面目。zui后一章,以一个案例结束《疯狂工作流讲义 基于Activiti 6.x的应用开发》的内容,案例中整合Spring、Struts2等主流框架,目的是让读者在学习的过程中更贴近实际案例。


  

作者简介

  杨恩雄,从事十多年JavaEE企业应用开发,曾任中企动力系统设计师、中企开源项目经理、数码辰星科技公司项目经理,参与过多个企业级项目的设计与架构工作,曾负责辰星“电影票网络销售系统”的整体架构。精通Activiti、Drools、ESB等开源技术,在SOA、SaaS、大数据应用、互联网系统架构方面有着丰富的经验,曾出版《疯狂Java实战演义》《疯狂Workflow讲义》《疯狂SpringCloud微服务架构实战》等书籍。

目录

第1章 Activiti介绍1
1.1 工作流介绍2
1.2 BPMN2.0规范简述2
1.2.1BPMN2.0概述3
1.2.2BPMN2.0元素3
1.2.3BPMN2.0的XML结构5
1.3Activiti介绍5
1.3.1Activiti的出现5
1.3.2Activiti的发展5
1.3.3选择Activiti还是jBPM5
1.4本章小结6
第2章 安装与运行Activiti7
2.1 下载与运行Activiti8
2.1.1 下载和安装JDK8
2.1.2 下载和安装MySQL9
2.1.3下载和安装Activiti10
2.2运行官方的Activiti示例11
2.2.1请假流程概述11
2.2.2新建用户11
2.2.3定义流程12
2.2.4发布流程14
2.2.5启动与完成流程15
2.2.6流程引擎管理16
2.3安装开发环境17
2.3.1下载Eclipse17
2.3.2安装Activiti插件18
2.4编写第一个Activiti程序19
2.4.1如何运行《疯狂工作流讲义 基于Activiti 6.x的应用开发》示例19
2.4.2建立工程环境19
2.4.3创建配置文件20
2.4.4创建流程文件20
2.4.5加载流程文件与启动流程21
2.5本章小结22
第3章 Activiti数据库设计23
3.1通用数据表24
3.1.1资源表24
3.1.2属性表24
3.2流程存储表25
3.2.1部署数据表25
3.2.2流程定义表25
3.3身份数据表25
3.3.1用户表25
3.3.2用户账号(信息)表26
3.3.3用户组表26
3.3.4关系表26
3.4运行时数据表26
3.4.1流程实例(执行流)表26
3.4.2流程任务表27
3.4.3流程参数表27
3.4.4流程与身份关系表27
3.4.5工作数据表28
3.4.6事件描述表28
3.5历史数据表28
3.5.1流程实例表28
3.5.2流程明细表29
3.5.3历史任务表和历史行为表29
3.5.4附件表和评论表29
3.6DMN规则引擎表30
3.6.1决策部署表30
3.6.2决策表30
3.6.3部署资源表30
3.7本章小结30
第4章 Activiti流程引擎配置31
4.1流程引擎配置对象32
4.1.1读取默认的配置文件32
4.1.2读取自定义的配置文件33
4.1.3读取输入流的配置33
4.1.4使用createStandaloneInMemProcess-EngineConfiguration方法34
4.1.5使用createStandaloneProcessEngine-Configuration方法34
4.2数据源配置35
4.2.1Activiti支持的数据库35
4.2.2Activiti与Spring35
4.2.3JDBC配置35
4.2.4DBCP数据源配置36
4.2.5C3P0数据源配置37
4.2.6Activiti其他数据源配置38
4.2.7数据库策略配置38
4.2.8databaseType配置39
4.3其他属性配置40
4.3.1history配置40
4.3.2asyncExecutorActivate配置41
4.3.3邮件服务器配置41
4.4ProcessEngineConfigurationbean41
4.4.1ProcessEngineConfiguration及其子类41
4.4.2自定义ProcessEngineConfiguration42
4.5Activiti的命令拦截器43
4.5.1命令模式44
4.5.2责任链模式45
4.5.3编写自定义拦截器47
4.6本章小结49
第5章 流程引擎的创建50
5.1ProcessEngineConfiguration的buildProcessEngine方法51
5.2ProcessEngines对象51
5.2.1init方法与getDefaultProcessEngine方法51
5.2.2registerProcessEngine方向和unregister方法52
5.2.3retry方法53
5.2.4destroy方法53
5.3ProcessEngine对象54
5.3.1服务组件54
5.3.2关闭流程引擎55
5.3.3流程引擎名称56
5.4本章小结56
第6章 用户组与用户57
6.1用户组管理58
6.1.1Group对象58
6.1.2创建用户组58
6.1.3修改用户组59
6.1.4删除用户组60
6.2Activiti数据查询61
6.2.1查询对象61
6.2.2list方法61
6.2.3listPage方法62
6.2.4count方法63
6.2.5排序方法63
6.2.6ID排序问题64
6.2.7多字段排序66
6.2.8singleResult方法67
6.2.9用户组数据查询68
6.2.10原生SQL查询69
6.3用户管理71
6.3.1User对象71
6.3.2添加用户71
6.3.3修改用户72
6.3.4删除用户72
6.3.5验证用户密码73
6.3.6用户数据查询74
6.3.7设置认证用户75
6.4用户信息管理77
6.4.1添加和删除用户信息77
6.4.2查询用户信息78
6.4.3设置用户图片78
6.5用户组与用户的关系80
6.5.1绑定关系80
6.5.2解除绑定81
6.5.3查询用户组下的用户81
6.5.4查询用户所属的用户组82
6.6本章小结83
第7章 流程存储84
7.1流程文件部署85
7.1.1Deployment对象85
7.1.2DeploymentBuilder对象85
7.1.3添加输入流资源86
7.1.4添加classpath资源87
7.1.5添加字符串资源88
7.1.6添加压缩包资源88
7.1.7添加BPMN模型资源89
7.1.8修改部署信息90
7.1.9过滤重复部署90
7.1.10 取消部署时的验证92
7.2流程定义的管理93
7.2.1 ProcessDefinition对象93
7.2.2流程部署93
7.2.3流程图部署95
7.2.4流程图自动生成95
7.2.5中止与激活流程定义96
7.2.6流程定义缓存配置97
7.2.7自定义缓存98
7.3流程定义权限100
7.3.1设置流程定义的用户权限100
7.3.2设置流程定义的用户组权限101
7.3.3IdentityLink对象102
7.3.4查询权限数据102
7.4RepositoryService数据查询与删除104
7.4.1查询部署资源104
7.4.2查询流程文件105
7.4.3查询流程图106
7.4.4查询部署资源名称107
7.4.5删除部署资源107
7.4.6DeploymentQuery对象108
7.4.7ProcessDefinitionQuery对象109
7.5本章小结109
第8章 流程任务管理110
8.1任务的创建与删除111
8.1.1Task接口111
8.1.2创建与保存Task实例112
8.1.3删除任务112
8.2任务权限113
8.2.1设置候选用户组114
8.2.2设置候选用户115
8.2.3权限数据查询116
8.2.4设置任务持有人118
8.2.5设置任务代理人119
8.2.6添加任务权限数据119
8.2.7删除用户组权限121
8.2.8删除用户权限122
8.3任务参数123
8.3.1基本类型参数设置124
8.3.2序列化参数125
8.3.3获取参数126
8.3.4参数作用域127
8.3.5设置多个参数128
8.3.6数据对象129
8.4任务附件管理130
8.4.1Attachment对象130
8.4.2创建任务附件130
8.4.3附件查询132
8.4.4删除附件133
8.5任务评论与事件记录133
8.5.1Comment对象133
8.5.2新增任务评论134
8.5.3事件的记录135
8.5.4数据查询136
8.6任务声明与完成137
8.6.1任务声明137
8.6.2任务完成138
8.7本章小结139
第9章 流程控制140
9.1流程实例与执行流141
9.1.1流程实例与执行流概念141
9.1.2流程实例和执行流对象(ProcessInstance与Execution)141
9.2启动流程142
9.2.1startProcessInstanceById方法142
9.2.2startProcessInstanceByKey方法144
9.2.3startProcessInstanceByMessage145
9.3流程参数146
9.3.1设置与查询流程参数147
9.3.2流程参数的作用域147
9.3.3其他设置参数的方法149
9.4流程操作149
9.4.1流程触发149
9.4.2触发信号事件150
9.4.3触发消息事件152
9.4.4中断与激活流程153
9.4.5删除流程154
9.5流程数据查询155
9.5.1执行流查询155
9.5.2流程实例查询157
9.6本章小结158
第10章 历史数据管理和流程引擎管理159
10.1历史数据管理160
10.1.1历史流程实例查询160
10.1.2历史任务查询161
10.1.3历史行为查询163
10.1.4历史流程明细查询165
10.1.5删除历史流程实例和历史任务166
10.2工作的产生167
10.2.1异步任务产生的工作168
10.2.2定时中间事件产生的工作169
10.2.3定时边界事件产生的工作170
10.2.4定时开始事件产生的工作171
10.2.5流程抛出事件产生的工作172
10.2.6暂停工作的产生174
10.2.7无法执行的工作175
10.3工作管理176
10.3.1工作查询对象176
10.3.2获取工作异常信息176
10.3.3转移与删除工作177
10.4数据库管理178
10.4.1查询引擎属性178
10.4.2数据表信息查询179
10.4.3数据库操作180
10.4.4数据表查询180
10.5本章小结181
第11章 流程事件182
11.1事件分类183
11.1.1按照事件的位置分类183
11.1.2按照事件的特性分类183
11.2事件定义183
11.2.1定时器事件定义184
11.2.2cron表达式184
11.2.3错误事件定义186
11.2.4信号事件定义186
11.2.5消息事件定义187
11.2.6取消事件定义187
11.2.7补偿事件定义188
11.2.8其他事件定义188
11.3开始事件188
11.3.1无指定开始事件188
11.3.2定时器开始事件189
11.3.3消息开始事件190
11.3.4错误开始事件191
11.4结束事件193
11.4.1无指定结束事件193
11.4.2错误结束事件194
11.4.3取消结束事件和取消边界事件196
11.4.4终止结束事件199
11.5边界事件200
11.5.1定时器边界事件201
11.5.2错误边界事件203
11.5.3信号边界事件204
11.5.4补偿边界事件206
11.6中间事件209
11.6.1中间事件分类209
11.6.2定时器中间事件210
11.6.3信号中间Catching事件211
11.6.4信号中间Throwing事件213
11.6.5消息中间事件215
11.6.6无指定中间事件215
11.7补偿中间事件215
11.7.1补偿执行次数215
11.7.2补偿的执行顺序217
11.7.3补偿的参数设置220
11.8本章小结221
第12章 流程任务222
12.1BPMN2.0任务223
12.1.1任务的继承223
12.1.2XML约束223
12.1.3任务的类型225
12.2用户任务226
12.2.1分配任务候选人226
12.2.2分配任务代理人228
12.2.3权限分配扩展228
12.2.4使用任务监听器进行权限分配229
12.2.5使用JUEL分配权限230
12.3脚本任务232
12.3.1脚本任务232
12.3.2JavaScript脚本233
12.3.3Groovy脚本234
12.3.4设置返回值235
12.3.5JUEL脚本236
12.4服务任务237
12.4.1Java服务任务238
12.4.2实现JavaDelegate238
12.4.3使用普通JavaBean240
12.4.4在Activiti中调用WebService241
12.4.5import元素242
12.4.6itemDefinition和message元素242
12.4.7interface与operation元素243
12.4.8设置WebService参数与返回值243
12.4.9发布WebService243
12.4.10使用WebServiceTask245
12.4.11JavaDelegate属性注入248
12.4.12在JavaDelegate中调用WebService251
12.4.13Shell任务253
12.5其他任务255
12.5.1手动任务和接收任务255
12.5.2邮件任务257
12.5.3Mule任务和业务规则任务258
12.6任务监听器259
12.6.1使用class指定监听器259
12.6.2使用expression指定监听器260
12.6.3使用delegateExpression指定
监听器261
12.6.4监听器的触发262
12.6.5属性注入263
12.7流程监听器263
12.7.1配置流程监听器263
12.7.2触发流程监听器的事件264
12.8本章小结267
第13章 其他流程元素268
13.1子流程269
13.1.1嵌入式子流程269
13.1.2调用式子流程271
13.1.3调用式子流程的参数传递273
13.1.4事件子流程275
13.1.5事务子流程277
13.1.6特别子流程280
13.2顺序流282
13.2.1条件顺序流282
13.2.2默认顺序流284
13.3流程网关286
13.3.1单向网关286
13.3.2并行网关288
13.3.3兼容网关291
13.3.4事件网关293
13.4流程活动特性295
13.4.1多实例活动295
13.4.2设置循环数据297
13.4.3获取循环元素298
13.4.4循环的内置参数300
13.4.5循环结束条件302
13.4.6补偿处理者304
13.5本章小结304
第14章 Activiti与规则引擎305
14.1概述306
14.1.1规则引擎Drools306
14.1.2Drools下载与安装306
14.2开发第一个Drools应用307
14.2.1建立Drools环境307
14.2.2编写规则308
14.2.3加载与运行308
14.3Drools规则语法概述309
14.3.1规则文件结构309
14.3.2关键字310
14.3.3规则编译310
14.4类型声明311
14.4.1声明新类型312
14.4.2使用ASM操作字节码313
14.4.3类型声明的使用314
14.4.4类型的继承316
14.4.5声明元数据317
14.5函数和查询317
14.5.1函数定义和使用318
14.5.2查询的定义和使用320
14.6规则语法321
14.6.1全局变量322
14.6.2规则属性323
14.6.3条件语法327
14.6.4行为语法330
14.7Activiti调用规则331
14.7.1业务规则任务332
14.7.2制定销售单优惠规则333
14.7.3实现销售流程336
14.8本章小结339
第15章 基于DMN的Activiti规则引擎340
15.1DMN规范概述341
15.1.1DMN的出现背景341
15.1.2Activiti与Drools341
15.1.3DMN的XML样例341
15.2DMN的XML规范342
15.2.1决策342
15.2.2决策表343
15.2.3输入参数343
15.2.4输出结果344
15.2.5规则344
15.3运行第一个应用345
15.3.1建立项目345
15.3.2规则引擎配置文件346
15.3.3编写DMN文件346
15.3.4加载与运行DMN文件347
15.4规则引擎API简述348
15.4.1创建规则引擎348
15.4.2配置规则引擎349
15.4.3数据查询350
15.4.4执行DMN文件350
15.5规则匹配351
15.5.1MVEL表达式简介351
15.5.2执行第一个表达式351
15.5.3使用对象执行表达式352
15.5.4规则引擎规则匹配逻辑353
15.5.5自定义表达式函数354
15.5.6Activiti中的自定义表达式函数355
15.5.7销售打折案例357
15.6本章小结360
第16章 整合第三方框架361
16.1SpringFramework362
16.1.1Spring的IoC362
16.1.2Spring的AOP362
16.1.3使用IoC363
16.1.4使用AOP364
16.2Activiti整合Spring365
16.2.1SpringProcessEngineConfiguration365
16.2.2资源的部署模式367
16.2.3ProcessEngineFactoryBean367
16.2.4在bean中注入Activiti服务368
16.2.5在Activiti中使用Spring的bean369
16.3Activiti整合Web项目371
16.3.1安装Tomcat插件371
16.3.2加入Spring373
16.3.3整合Hibernate375
16.3.4配置声明式事务377
16.3.5添加Struts配置378
16.3.6实现一个最简单的逻辑378
16.3.7测试事务380
16.3.8添加Activiti380
16.4Activiti与SpringBoot381
16.4.1SpringBoot项目简介381
16.4.2下载与安装Maven382
16.4.3开发第一个Web应用383
16.4.4Activiti与SpringBoot的整合386
16.5Activiti与JPA388
16.5.1建立与运行JPA项目388
16.5.2在Activiti中使用JPA390
16.5.3Activiti、Spring与JPA的整合391
16.5.4基于JPA的例子393
16.6本章小结395
第17章 Activiti开放的WebService396
17.1WebService简介397
17.1.1WebService397
17.1.2SOAP协议397
17.1.3REST架构397
17.1.4REST的设计准则398
17.1.5REST的主要特性398
17.1.6SOAPRPC与REST的区别399
17.2使用SpingMVC发布REST399
17.2.1在Web项目中加入SpringMVC400
17.2.2发布REST的WebService401
17.2.3使用Restlet编写客户端402
17.2.4使用CXF编写客户端402
17.2.5使用HttpClient编写客户端403
17.2.6准备测试数据403
17.2.7部署Activiti的WebService403
17.2.8接口访问权限404
17.2.9访问Activiti接口404
17.3流程存储服务405
17.3.1上传部署文件405
17.3.2部署数据查询406
17.3.3部署资源查询406
17.3.4查询单个部署资源407
17.3.5删除部署408
17.4本章小结409
第18章 Activiti功能进阶410
18.1流程控制逻辑411
18.1.1概述411
18.1.2设计流程对象411
18.1.3创建流程节点行为类413
18.1.4编写业务处理类414
18.1.5将流程XML转换为Java对象414
18.1.6编写客户端代码416
18.2Activiti的表单416
18.2.1概述416
18.2.2表单属性417
18.2.3外部表单418
18.2.4关于动态工作流和动态表单419
18.3流程图XML419
18.3.1节点元素419
18.3.2衔接元素420
18.3.3流程图与流程文件的转换420
18.4流程操作421
18.4.1流程回退421
18.4.2会签422
18.5本章小结424
第19章 办公自动化系统425
19.1使用技术426
19.1.1表现层技术426
19.1.2MVC框架426
19.1.3Spring和Hibernate426
19.2功能简述427
19.2.1系统的角色管理427
19.2.2薪资计算流程427
19.2.3请假流程427
19.2.4薪资调整流程427
19.2.5报销流程428
19.3框架整合428
19.3.1创建Web项目428
19.3.2整合Spring429
19.3.3整合Hibernate430
19.3.4整合Struts2432
19.3.5整合Activiti433
19.4数据库设计434
19.4.1薪资表434
19.4.2请假记录表434
19.4.3薪资调整记录表435
19.4.4报销记录表436
19.5初始化数据437
19.5.1初始化角色数据437
19.5.2薪资计算流程438
19.5.3请假流程439
19.5.4报销流程439
19.5.5薪资调整流程440
19.6角色管理441
19.6.1用户组管理442
19.6.2用户列表443
19.6.3新建用户445
19.6.4用户登录446
19.7流程启动447
19.7.1启动请假流程447
19.7.2启动报销流程450
19.7.3启动薪资调整流程452
19.8申请列表453
19.8.1申请列表的实现453
19.8.2请假申请列表454
19.8.3报销申请列表455
19.8.4薪资调整列表455
19.8.5查看流程图456
19.9流程任务457
19.9.1待办任务列表457
19.9.2领取任务与受理任务列表459
19.9.3查询任务信息460
19.9.4任务审批462
19.9.5运行OA的流程463
19.10本章小结463

前言/序言

  前言

  当今技术发展一日千里,各种技术框架如雨后春笋般涌现,技术正在改变世界、改变生活。作者从业十余年,面对如此变幻莫测的世界,亦难岿然不动,面对日新月异的知识,时常怀着一颗谦卑的心。只有学习,才能带来快乐,才不会被淘汰。程序是枯燥的,但程序又是美丽的,看似冷冰冰的代码,实则丰富多彩。

  Java是目前世界上应用最广泛的语言,在Java领域出现了众多优秀的框架和组件,这些组件正在慢慢提高编程的效率,使得编程这项原本枯燥的工作变得更为优雅与简单。在工作流领域,涌现出多个使用Java语言编写的框架,如OpenWFE、jBPM、Shark,甚至在国内市面上出现了不少国产的工作流引擎。近年来,出现了一款“全新”的工作流框架Activiti,经过几年的发展,Activiti已经成为一款成熟的工作流产品。笔者在2014年,基于Activiti5.0版本,编写了《疯狂Workflow讲义》第一版,Activiti6.0在2017年发布,为了帮助广大的Java研发者学习新框架,笔者对《疯狂Workflow讲义》进行升级,并将多年的实践经验融入《疯狂工作流讲义 基于Activiti 6.x的应用开发》中。

  《疯狂工作流讲义 基于Activiti 6.x的应用开发》经过约半年的编写,至今能得以付梓,得益于多方襄助,对他们的感激之情,难以言表。感谢传道并解惑的恩师,感谢聪颖而好学的读者,感谢善良和亲爱的家人,笔者会谢意永存、铭感不忘。

  《疯狂工作流讲义 基于Activiti 6.x的应用开发》内容概括

  《疯狂工作流讲义 基于Activiti 6.x的应用开发》是一本介绍Java工作流领域的书,以Activiti为核心,内容囊括了多个流行的企业级JavaEE框架,《疯狂工作流讲义 基于Activiti 6.x的应用开发》主要可分为以下几个部分。

  第一部分:对Activiti的基础知识进行讲解,包括框架起源、基本的设计模式、数据库设置以及框架配置等,该部分知识可以帮助读者对Activiti有一个较为深入的认识,对Activiti的设计有一个初步的印象,该部分内容也可以作为整合Activiti到项目中的参考。

  第二部分:从源代码的实现上讲解Activiti各个模块的API,除了讲述这些API的作用外,还会引领读者深入到这些API的内部,此部分内容可以作为一个详细的ActivitiAPI的帮助文档。

  第三部分:详细讲述了BPMN2.0规范的内容,包括目前Activiti对该规范的实现情况。在讲解BPMN2.0规范时,将规范与Activiti的实现进行结合,让读者在通俗易懂的例子示范下,对Activiti的实现及BPMN2.0规范有较为深入的了解。

  第四部分:Activiti6支持的DMN规范,《疯狂工作流讲义 基于Activiti 6.x的应用开发》将在第15章中讲述Activiti基于DMN规范的规则引擎。Activiti的规则引擎目前尚未正式面世,笔者研读了当前版本的源代码,并带领读者优先体会了Activiti的规则引擎。

  第五部分:讲述如何在实际企业应用中使用Activiti,并与其他流行的开源框架进行整合,包括企业应用开发所必须使用的WebService、企业服务总线、规则引擎、IoC框架和ORM框架等。除了主要的Activiti知识外,企业中常用框架的知识,也在该部分内容中得到了体现。通过学习这部分内容,可以极大丰富你的实战知识,让你成为一个更全面的技术人员。

  第六部分:在第18章中讲述了Activiti的核心架构及Activiti的表单知识,《疯狂工作流讲义 基于Activiti 6.x的应用开发》最后一章,通过讲解一个办公系统的开发过程,让读者更了解Activiti在实际生产中的应用,从而理论层面,走上实践的道路。

  《疯狂工作流讲义 基于Activiti 6.x的应用开发》特点

  笔者长期工作于企业的IT部门,有着丰富的企业应用开发经验,因此《疯狂工作流讲义 基于Activiti 6.x的应用开发》具有以下特点。

  1.内容深入

  从笔者接触编程开始,就养成了查看源代码的习惯,书中的示例不仅仅能帮助理解Activiti的功能,更借鉴了Activiti的思路去模拟功能的实现,所以读者能够深入了解其中的原理。

  2.开发环境与示例更贴近实际

  《疯狂工作流讲义 基于Activiti 6.x的应用开发》中示例的开发环境、使用的框架及工具均来自企业的实际应用,示例的选取与研发过程更贴近实际。

  3.注释详细

  《疯狂工作流讲义 基于Activiti 6.x的应用开发》的代码几乎每行都有注释,读者可以很容易地了解代码的意思,轻松掌握相应的知识。

  《疯狂工作流讲义 基于Activiti 6.x的应用开发》写给谁看

  如果你有一定的Java语言基础,进行过Web项目的开发,对工作流有一定的认识,那么《疯狂工作流讲义 基于Activiti 6.x的应用开发》可以帮助你提升关于工作流的知识水平。如果你是一个从事过企业应用开发的程序员,《疯狂工作流讲义 基于Activiti 6.x的应用开发》同样适合你,《疯狂工作流讲义 基于Activiti 6.x的应用开发》的知识可以帮助你深入理解工作流引擎,使你可以将这些工作流框架应用到实际的企业生产中。

  衷心感谢

  首先非常感谢李刚老师,一直以来,他既是我的老师,也是我的技术后盾,非常幸运人生能有这样一位良师益友。

  其次感谢出版社的编辑,为《疯狂工作流讲义 基于Activiti 6.x的应用开发》的出版做了很多细致的工作,并为《疯狂工作流讲义 基于Activiti 6.x的应用开发》提出了许多宝贵的意见。

  最后感谢我的家人,你们是我前进的动力。



其他推荐