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":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,去執行一些特殊的操作。

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM