Spring 事件監(jiān)聽機制實現(xiàn)跨模塊調(diào)用的思路詳解
之前一個項目,有兩個模塊,A 模塊需要依賴 B 模塊,但現(xiàn)在 B 模塊有地方需要調(diào)用 A 模塊的方法,如果直接依賴,又會產(chǎn)生循環(huán)依賴問題。最終選擇使用 spring 的事件監(jiān)聽來解決該問題。
思路就是,B 模塊去發(fā)布事件,A 中監(jiān)聽,得到數(shù)據(jù)后,通過引用返回給 B。
首先是定義事件
public class getUserInfoEvent extends ApplicationEvent { private String message; private Integer griddingId; private StringBuilder griddingName; public getUserInfoEvent(Object source, String message, Integer griddingId, StringBuilder griddingName) { super(source); this.message = message; this.griddingId = griddingId; this.griddingName = griddingName;//接收要獲取到值的StringBuilder } public StringBuilder getGriddingName() { return griddingName; } public Integer getGriddingId() { return griddingId; } public String getMessage() { return message; } }
然后在 B 中去發(fā)布事件
@Autowired ApplicationEventPublisher applicationEventPublisher; //這個必須注入 @Override public SysUserVO getUserInfo(Long userId) { SysUser user = getById(userId); Integer griddingId = user.getGriddingId(); StringBuilder griddingName= new StringBuilder(); //使用stringbuilder進(jìn)行引用字符串操作,來獲取需要的值 //上面是業(yè)務(wù)相關(guān) getUserInfoEvent event = new getUserInfoEvent(this,"發(fā)布“獲取用戶信息”事件",griddingId,griddingName); //定義事件 applicationEventPublisher.publishEvent(event); //發(fā)布事件 //下面是獲取到數(shù)據(jù)之后的操作,不重要 //這里事件是同步進(jìn)行的 SysUserVO sysUserVO = new SysUserVO(); BeanUtils.copyProperties(user,sysUserVO); sysUserVO.setGriddingName(griddingName.toString()); // 找到該用戶所屬角色 String roleName = getRoleByUserId(userId); sysUserVO.setRoleName(roleName); SysUser parentUser = sysUserMapper.selectById(user.getParentId()); sysUserVO.setParentName(ObjectUtils.isEmpty(parentUser) ? null : parentUser.getUserName()); return sysUserVO; }
最后在 A 中監(jiān)聽事件
@EventListener public void getGriddingNameByUserIdEventListener(getUserInfoEvent event) { //參數(shù)必須填寫要監(jiān)聽的事件類,事件發(fā)布后這邊就會監(jiān)聽到 //形參event中存有傳遞的相關(guān)數(shù)據(jù) System.out.println(event.getMessage()); //會打印出---發(fā)布“獲取用戶信息”事件 //下面為個人業(yè)務(wù)相關(guān)代碼 Integer griddingId = event.getGriddingId(); StringBuilder griddingName = event.getGriddingName(); //再通過網(wǎng)格id來查找對應(yīng)的網(wǎng)格信息 GriddingArea griddingArea = getOne(new LambdaQueryWrapper<GriddingArea>().eq(GriddingArea::getId, griddingId)); griddingName.append(griddingArea.getGriddingName()); //使用同一個StringBuilder對象來操作,這里把獲取到的字符串存入后,事件發(fā)布者那邊就能得到數(shù)據(jù)了。 System.out.println("griddingName"+griddingName); }
非常好用??
到此這篇關(guān)于 Spring 事件監(jiān)聽機制實現(xiàn)跨模塊調(diào)用的文章就介紹到這了,更多相關(guān) Spring 事件監(jiān)聽機制內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java之HashMap.values()轉(zhuǎn)List時的錯誤和正確演示
這篇文章主要介紹了Java之HashMap.values()轉(zhuǎn)List時的錯誤和正確演示,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-03-03java中線程的sleep()方法和yield()方法的區(qū)別
本文主要介紹了java中線程的sleep()方法和yield()方法的區(qū)別,Thread類的sleep()方法使線程休眠指定時間,不釋放鎖,而yield()提示調(diào)度器當(dāng)前線程愿意讓出CPU資源,不保證立即切換線程,感興趣的可以了解一下2024-10-10MyBatisPlus使用@TableField注解處理默認(rèn)填充時間的問題
這篇文章主要介紹了MyBatisPlus使用@TableField注解處理默認(rèn)填充時間的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-01-01Java 語言守護(hù)線程 Daemon Thread使用示例詳解
這篇文章主要為大家介紹了Java 語言守護(hù)線程 Daemon Thread使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10Java?Cookie與Session實現(xiàn)會話跟蹤詳解
session的工作原理和cookie非常類似,在cookie中存放一個sessionID,真實的數(shù)據(jù)存放在服務(wù)器端,客戶端每次發(fā)送請求的時候帶上sessionID,服務(wù)端根據(jù)sessionID進(jìn)行數(shù)據(jù)的響應(yīng)2022-11-11SpringBoot 中html的頁面間跳轉(zhuǎn)問題小結(jié)
這篇文章主要介紹了SpringBoot 中html的頁面間跳轉(zhuǎn)問題小結(jié),本文給大家分享兩種方法,結(jié)合實例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2023-10-10