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":1,"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":1,"isInserted":false,"isUpdated":false,"isDeleted":false} group = {"name":null,"type":null,"id":"group1","revision":1,"isInserted":false,"isUpdated":false,"isDeleted":false} group = {"name":null,"type":null,"id":"group2","revision":1,"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":2,"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":1,"isInserted":false,"isUpdated":false,"isDeleted":false} group = {"name":null,"type":null,"id":"group1","revision":1,"isInserted":false,"isUpdated":false,"isDeleted":false} group = {"name":null,"type":null,"id":"group2","revision":1,"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,去執行一些特殊的操作。