IdentityService并不依赖我们的流程部署文件,所以

直接放使用方法的测试代码了:

  1. public class IdentityServiceTest {
  2. private static final Logger LOGGER = LoggerFactory.getLogger(IdentityServiceTest.class);
  3.  
  4. @Rule
  5. public ActivitiRule activitiRule = new ActivitiRule();
  6.  
  7. @Test
  8. public void testIdentity(){
  9. //其实IdentityService并不依赖我们的流程部署文件
  10. IdentityService identityService = activitiRule.getIdentityService();
  11.  
  12. //通过IdentityService来new出user
  13. User user1 = identityService.newUser("user1");
  14. user1.setEmail("user1@136.com");
  15. User user2 = identityService.newUser("user2");
  16. user2.setEmail("user2@136.com");
  17. //设置完用户信息以后,保存到数据库一下
  18. identityService.saveUser(user1);
  19. identityService.saveUser(user2);
  20.  
  21. //通过IdentityService来new出group
  22. Group group1 = identityService.newGroup("group1");
  23. Group group2 = identityService.newGroup("group2");
  24. //同样将用户组也存进数据库
  25. identityService.saveGroup(group1);
  26. identityService.saveGroup(group2);
  27.  
  28. //将刚创建的两个user与group设立关系;
  29. identityService.createMembership("user1","group1");
  30. identityService.createMembership("user2","group1");
  31. identityService.createMembership("user1","group2");
  32.  
  33. //通过identityService的createUserQuery()方法创建查询对象并通过用户组去 查询用户
  34. List<User> userList = identityService.createUserQuery().memberOfGroup("group1").listPage(0, 100);
  35. for (User user : userList) {
  36. LOGGER.info("user = {}", ToStringBuilder.reflectionToString(user, ToStringStyle.JSON_STYLE));
  37. }
  38.  
  39. //查询一下组
  40. List<Group> groupList = identityService.createGroupQuery().groupMember("user1").listPage(0, 100);
  41. for (Group group : groupList) {
  42. LOGGER.info("group = {}",ToStringBuilder.reflectionToString(group, ToStringStyle.JSON_STYLE));
  43. }
  44. }
  45. }

输出结果如下:

  1. 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}
  2. 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}
  3. group = {"name":null,"type":null,"id":"group1","revision":,"isInserted":false,"isUpdated":false,"isDeleted":false}
  4. group = {"name":null,"type":null,"id":"group2","revision":,"isInserted":false,"isUpdated":false,"isDeleted":false}

ps:修改user名字的方式:

  1. //修改一下用户名
  2. User user11 = identityService.createUserQuery().userId("user1").singleResult();
  3. user11.setLastName("lyf");
  4. identityService.saveUser(user11);

输出如下:

  1. 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}
  2. 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}
  3. group = {"name":null,"type":null,"id":"group1","revision":,"isInserted":false,"isUpdated":false,"isDeleted":false}
  4. 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. MyWebViewDemo【封装Webview常用配置和选择文件、打开相机、录音、打开本地相册的用法】

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 封装webview的常用配置和选择文件.打开相机.录音.打开本地相册的用法.[如果想要使用简单的预览功能,可以参考<MyBri ...

  2. SLAM+语音机器人DIY系列:(四)差分底盘设计——3.底盘通信协议

    摘要 运动底盘是移动机器人的重要组成部分,不像激光雷达.IMU.麦克风.音响.摄像头这些通用部件可以直接买到,很难买到通用的底盘.一方面是因为底盘的尺寸结构和参数是要与具体机器人匹配的:另一方面是因为 ...

  3. IOS多态在项目中的应用

    今天我们讲述一个知识点(大家可能遗漏的) 多态是面试程序设计(OOP)一个重要特征,但在iOS中,可能比较少的人会留意这个特征,实际上在开发中我们可能已经不经意的使用了多态.比如说: 有一个table ...

  4. Java Calendar类使用总结

    平时在浏览一些网站时,有些网站会显示出当前时间,如现在是xx年xx月xx日 xx时xx分xx秒,在实际的开发过程中,也会涉及到日期和时间的计算,Java中提供了一个专门的类Calendar来处理日期与 ...

  5. java类与对象(属性,方法)的使用

    ---恢复内容开始--- 类和对象是java编程中很重要的应该面向对象的一课,实际上可以将类看作对象的载体,它定义了对象所具有的功能.Java是面向对象的语言,因此掌握类与对象是学习Java语言的基础 ...

  6. MySQL逻辑架构概述

    1.MySQL逻辑架构 MySQL逻辑架构图 MySQL逻辑架构分四层 1.连接层:主要完成一些类似连接处理,授权认证及相关的安全方案. 2.服务层:在 MySQL据库系统处理底层数据之前的所有工作都 ...

  7. loj#6073. 「2017 山东一轮集训 Day5」距离(树链剖分 主席树)

    题意 题目链接 Sol 首先对询问差分一下,我们就只需要统计\(u, v, lca(u, v), fa[lca(u, v)]\)到根的路径的贡献. 再把每个点与\(k\)的lca的距离差分一下,则只需 ...

  8. H3C交换机S5500划分VLAN

    好记性不如烂笔头! H3C交换机S5500划分VLAN       将H3C S5500换机现在需要分三网段,分别是VLAN14,VLAN15,VLAN16,交换机中默认全部口是VLAN1.   H3 ...

  9. 谈下git的基本操作

    在工作之后,我比较经常地接触git,关于git的用法,网上有很多的教程,而且git的指令是非常多的,强如阮一峰这样的高手也直言无法记住git的很多指令.实际上我也看了不少关于git指令的文章,个人觉得 ...

  10. java笔记----property文件读写

    package com.test.property; import java.io.BufferedInputStream; import java.io.File; import java.io.F ...