Activiti6-IdentityService(学习笔记)

IdentityService并不依赖我们的流程部署文件,所以
直接放使用方法的测试代码了:
public class IdentityServiceTest {
private static final Logger LOGGER = LoggerFactory.getLogger(IdentityServiceTest.class);
@Rule
public ActivitiRule activitiRule = new ActivitiRule();
@Test
public void testIdentity(){
//其实IdentityService并不依赖我们的流程部署文件
IdentityService identityService = activitiRule.getIdentityService();
//通过IdentityService来new出user
User user1 = identityService.newUser("user1");
user1.setEmail("user1@136.com");
User user2 = identityService.newUser("user2");
user2.setEmail("user2@136.com");
//设置完用户信息以后,保存到数据库一下
identityService.saveUser(user1);
identityService.saveUser(user2);
//通过IdentityService来new出group
Group group1 = identityService.newGroup("group1");
Group group2 = identityService.newGroup("group2");
//同样将用户组也存进数据库
identityService.saveGroup(group1);
identityService.saveGroup(group2);
//将刚创建的两个user与group设立关系;
identityService.createMembership("user1","group1");
identityService.createMembership("user2","group1");
identityService.createMembership("user1","group2");
//通过identityService的createUserQuery()方法创建查询对象并通过用户组去 查询用户
List<User> userList = identityService.createUserQuery().memberOfGroup("group1").listPage(0, 100);
for (User user : userList) {
LOGGER.info("user = {}", ToStringBuilder.reflectionToString(user, ToStringStyle.JSON_STYLE));
}
//查询一下组
List<Group> groupList = identityService.createGroupQuery().groupMember("user1").listPage(0, 100);
for (Group group : groupList) {
LOGGER.info("group = {}",ToStringBuilder.reflectionToString(group, ToStringStyle.JSON_STYLE));
}
}
}
输出结果如下:
user = {"firstName":null,"lastName":null,"email":"user1@136.com","password":null,"pictureByteArrayRef":"ByteArrayRef[id=null, name=null, entity=null]","id":"user1","revision":,"isInserted":false,"isUpdated":false,"isDeleted":false}
user = {"firstName":null,"lastName":null,"email":"user2@136.com","password":null,"pictureByteArrayRef":"ByteArrayRef[id=null, name=null, entity=null]","id":"user2","revision":,"isInserted":false,"isUpdated":false,"isDeleted":false}
group = {"name":null,"type":null,"id":"group1","revision":,"isInserted":false,"isUpdated":false,"isDeleted":false}
group = {"name":null,"type":null,"id":"group2","revision":,"isInserted":false,"isUpdated":false,"isDeleted":false}
ps:修改user名字的方式:
//修改一下用户名
User user11 = identityService.createUserQuery().userId("user1").singleResult();
user11.setLastName("lyf");
identityService.saveUser(user11);
输出如下:
user = {"firstName":null,"lastName":"lyf","email":"user1@136.com","password":null,"pictureByteArrayRef":"ByteArrayRef[id=null, name=null, entity=null]","id":"user1","revision":,"isInserted":false,"isUpdated":false,"isDeleted":false}
user = {"firstName":null,"lastName":null,"email":"user2@136.com","password":null,"pictureByteArrayRef":"ByteArrayRef[id=null, name=null, entity=null]","id":"user2","revision":,"isInserted":false,"isUpdated":false,"isDeleted":false}
group = {"name":null,"type":null,"id":"group1","revision":,"isInserted":false,"isUpdated":false,"isDeleted":false}
group = {"name":null,"type":null,"id":"group2","revision":,"isInserted":false,"isUpdated":false,"isDeleted":false}
在我们执行方法保存用户的过程中,IdentityService 具体的实现做的是什么事情呢?流程如下图:

先调用一个命令执行器,把saveUser这个对象封装成一个命令对象,也就是把user这个对象,构建成一个SaveUserCmd,就是把参数组装成了一个命令。
组装成命令以后,用命令执行器去执行这个命令,那么在执行这个命令的过程中,真正执行命令的方式是
实现了一个UserEntityManager 这样一个接口,它的实现会做一个调用我们底层数据库的修改,底层数据库的修改回去间接的调用UserDataManger这个又一次封装的接口,它接口的实现也就是MybatisUserDataManger,也就是经过多层的调用,IdentityService的saveUser经过一个链式调用以后,最终通过mybatis的操作方式DbSqlSession执行了一个insert操作把我们的数据保存到了数据库中。
源码如下:



这execute中 用UserEntityManger的isNewUser()判断了user是不是新用户,
判断方式是获取这个user的版本号vision是否为0,是就为新用户,否则就为老用户。

这里的判断其实是为了确认是用写入(insert语句)还是更新(update语句)的判断。
在这个判断中还判断了user是否实现了UserEntity接口
如果实现了就会同时触发一个创建user的事件,如果没有就直接写入数据库了。
而UserEntityManger的insert的方法,它其实是继承了父类EntityManager的insert,而EntityManager的insert方法其实调用了DataManager的insert方法,源码如下:



接着再看DataManager的insert方法
会发现是调的UserDataManager接口,而它的实现类为

然后,UserDataManager的实现类MybatisUserDataManager的insert方法如下:

调用的是DbSqlSession的insert

如果有特殊的需求,可以定义命令执行器CommandExecutor,去执行一些特殊的操作。
Activiti6-IdentityService(学习笔记)的更多相关文章
- activiti学习笔记一
activiti学习笔记 在讲activiti之前我们必须先了解一下什么是工作流,什么是工作流引擎. 在我们的日常工作中,我们会碰到很多流程化的东西,什么是流程化呢,其实通俗来讲就是有一系列固定的步骤 ...
- js学习笔记:webpack基础入门(一)
之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...
- PHP-自定义模板-学习笔记
1. 开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2. 整体架构图 ...
- PHP-会员登录与注册例子解析-学习笔记
1.开始 最近开始学习李炎恢老师的<PHP第二季度视频>中的“章节5:使用OOP注册会员”,做一个学习笔记,通过绘制基本页面流程和UML类图,来对加深理解. 2.基本页面流程 3.通过UM ...
- 2014年暑假c#学习笔记目录
2014年暑假c#学习笔记 一.C#编程基础 1. c#编程基础之枚举 2. c#编程基础之函数可变参数 3. c#编程基础之字符串基础 4. c#编程基础之字符串函数 5.c#编程基础之ref.ou ...
- JAVA GUI编程学习笔记目录
2014年暑假JAVA GUI编程学习笔记目录 1.JAVA之GUI编程概述 2.JAVA之GUI编程布局 3.JAVA之GUI编程Frame窗口 4.JAVA之GUI编程事件监听机制 5.JAVA之 ...
- seaJs学习笔记2 – seaJs组建库的使用
原文地址:seaJs学习笔记2 – seaJs组建库的使用 我觉得学习新东西并不是会使用它就够了的,会使用仅仅代表你看懂了,理解了,二不代表你深入了,彻悟了它的精髓. 所以不断的学习将是源源不断. 最 ...
- CSS学习笔记
CSS学习笔记 2016年12月15日整理 CSS基础 Chapter1 在console输入escape("宋体") ENTER 就会出现unicode编码 显示"%u ...
- HTML学习笔记
HTML学习笔记 2016年12月15日整理 Chapter1 URL(scheme://host.domain:port/path/filename) scheme: 定义因特网服务的类型,常见的为 ...
- DirectX Graphics Infrastructure(DXGI):最佳范例 学习笔记
今天要学习的这篇文章写的算是比较早的了,大概在DX11时代就写好了,当时龙书11版看得很潦草,并没有注意这篇文章,现在看12,觉得是跳不过去的一篇文章,地址如下: https://msdn.micro ...
随机推荐
- 使用阿里云的图片识别成表格ocr(将图片表格转换成excel)
为了简便财务总是要对照着别人发来的表格图片制作成自己的表格 图片识别 识别成表格 表格识别 ocr 使用阿里云api 购买(印刷文字识别-表格识别) https://market.aliyun.com ...
- RDIFramework.NET代码生成器全新V3.5版本发布-重大升级
发布说明 RDIFramework.NET代码生成器V3.5版本全新震撼推出,相比上次版本,本次发布新增与修改的内容如下: 1.全新增加了WinForm界面代码的生成,可直接生成常用的主界面(集新增. ...
- spring-boot-2.0.3源码篇 - @Configuration、Condition与@Conditional
前言 开心一刻 一名劫匪慌忙中窜上了一辆车的后座,上车后发现主驾和副驾的一男一女疑惑地回头看着他,他立即拔出枪威胁到:“赶快开车,甩掉后面的警车,否则老子一枪崩了你!”,于是副驾上的男人转过脸对那女的 ...
- 命令提示符-bash-4.1$错误解决
有时候在使用用户登陆Linux系统时会发现,命令行提示符成了:-bash-4.1$,不显示用户名,路径信息. 原因:用户家目录里面与环境变量有关的文件被删除所导致的 也就是这俩文件:.bash_pro ...
- C#的一些获取时间的例子
从周一到周日的顺序,获取排序数值: int i = DateTime.Now.DayOfWeek - DayOfWeek.Monday; if (i == -1) i = 6; 获取某日起,星期一日期 ...
- 纯手写springIOC
大家好啊- 那么今天来带大家写一下spring的ioc. 其实也很简单,首先我们明白两点,java解析xml和java的反射机制,因为ioc就是主要是基于这两个来实现,今天只是简单的来大家实现下. 废 ...
- 80后程序员降薪6K,预感中年危机来袭,准备跳槽却碰壁
一提及程序员,很多人想到的都是“工资高”“技术好”诸如此类的,可见程序员是个非常赚钱的职业,所以每年都会有很多毕业生来选择这个行业. 但是社会是公平的,不要只看程序员表面上的光鲜亮丽,其背后也有很多的 ...
- 基于geotools的(两个)SHP要素变化提取方法预研
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1. 背景 我们用遥感的手段进行卫星特征提取.多幅影像间的特征变化提取的 ...
- 【English】十五、“a”和“one”的区别是什么?
一."a"和"one"的区别是什么 参考:“a”和“one”的区别是什么-百度知道 a和one的区别是什么?-作业帮 1.尽管a和one这两个在意义上有些相似, ...
- docker 集群 zookeeper 碰到 java.net.NoRouteToHostException: Host is unreachable (Host unreachable)
最近在学 zookeeper ,按照 docker 官网的方式集群 zookeeper , 然后发现有路由找不到.最后问题解决了,随手记录下来. 原因是 firewalld 的没有信任 docker ...