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(学习笔记)的更多相关文章

  1. activiti学习笔记一

    activiti学习笔记 在讲activiti之前我们必须先了解一下什么是工作流,什么是工作流引擎. 在我们的日常工作中,我们会碰到很多流程化的东西,什么是流程化呢,其实通俗来讲就是有一系列固定的步骤 ...

  2. js学习笔记:webpack基础入门(一)

    之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...

  3. PHP-自定义模板-学习笔记

    1.  开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2.  整体架构图 ...

  4. PHP-会员登录与注册例子解析-学习笔记

    1.开始 最近开始学习李炎恢老师的<PHP第二季度视频>中的“章节5:使用OOP注册会员”,做一个学习笔记,通过绘制基本页面流程和UML类图,来对加深理解. 2.基本页面流程 3.通过UM ...

  5. 2014年暑假c#学习笔记目录

    2014年暑假c#学习笔记 一.C#编程基础 1. c#编程基础之枚举 2. c#编程基础之函数可变参数 3. c#编程基础之字符串基础 4. c#编程基础之字符串函数 5.c#编程基础之ref.ou ...

  6. JAVA GUI编程学习笔记目录

    2014年暑假JAVA GUI编程学习笔记目录 1.JAVA之GUI编程概述 2.JAVA之GUI编程布局 3.JAVA之GUI编程Frame窗口 4.JAVA之GUI编程事件监听机制 5.JAVA之 ...

  7. seaJs学习笔记2 – seaJs组建库的使用

    原文地址:seaJs学习笔记2 – seaJs组建库的使用 我觉得学习新东西并不是会使用它就够了的,会使用仅仅代表你看懂了,理解了,二不代表你深入了,彻悟了它的精髓. 所以不断的学习将是源源不断. 最 ...

  8. CSS学习笔记

    CSS学习笔记 2016年12月15日整理 CSS基础 Chapter1 在console输入escape("宋体") ENTER 就会出现unicode编码 显示"%u ...

  9. HTML学习笔记

    HTML学习笔记 2016年12月15日整理 Chapter1 URL(scheme://host.domain:port/path/filename) scheme: 定义因特网服务的类型,常见的为 ...

  10. DirectX Graphics Infrastructure(DXGI):最佳范例 学习笔记

    今天要学习的这篇文章写的算是比较早的了,大概在DX11时代就写好了,当时龙书11版看得很潦草,并没有注意这篇文章,现在看12,觉得是跳不过去的一篇文章,地址如下: https://msdn.micro ...

随机推荐

  1. js数组遍历(for in ,for of ,map,foreach,filter)的区别

    一.for in 和for of 的区别 1.for in 遍历数组时,索引实际上是字符串类型的数字,不能进行运算,我们来输出一下: let arr = [1,3,5,4] for (let inde ...

  2. 多机同步管理hexo博客

    转载自:https://www.zhihu.com/question/21193762/answer/79109280 一.关于搭建的流程 创建仓库,<your github username& ...

  3. PyCharm:选择性忽略 PEP8 警告

    PyCharm 是个很强大的 python IDE,PEP 8 的告警提示也很好用,但是函数名不能包含大写字母等少数几个规范真心觉得不好,作为一名处女座强迫症患者,代码下面的波浪线这种东西是绝对不允许 ...

  4. java基础(五):谈谈java中的多线程

    1.多线程 1.1.多线程介绍 学习多线程之前,我们先要了解几个关于多线程有关的概念. 进程:正在运行的程序.确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程序,并且具有一 ...

  5. asp.net mvc 简单项目框架的搭建(二)—— Spring.Net在Mvc中的简单应用

    摘要:上篇写了如何搭建一个简单项目框架的上部分,讲了关于Dal和Bll之间解耦的相关知识,这篇来把后i面的部分说一说. 上篇讲到DbSession,现在接着往下讲. 首先,还是把一些类似的操作完善一下 ...

  6. .NET Core:API文档

    安装:Swashbuckle.AspNetCore 启用 XML 注释:右键单击“解决方案资源管理器”中的项目,然后选择“属性”.勾选“生成”选项卡的“输出”部分下的“XML 文档文件”框. 将 Sw ...

  7. 第二章:shiro身份验证

    身份验证,即在应用中谁能证明他就是他本人.一般提供如他们的身份ID一些标识信息来表明他就是他本人,如提供身份证,用户名/密码来证明. 在shiro中,用户需要提供principals (身份)和cre ...

  8. bootstrap实现表格

    基本实例样式 效果 代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&q ...

  9. h5与c3权威指南笔记--css3新属性选择器

    [att*=val] 选择所有att属性值中包含val的.只要包含val值,不论val值在属性值的前面还是中间还是后面~ <style> div[class*=div]{ color: r ...

  10. 微信小程序 canvas 绘制圆形状

    page({ // 绘制canvas drawCanvas:function(){ const ctx = wx.createCanvasContext('poster') // 画圆形二维码 thi ...