Spring 事件監(jiān)聽機(jī)制實現(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)聽機(jī)制實現(xiàn)跨模塊調(diào)用的文章就介紹到這了,更多相關(guān) Spring 事件監(jiān)聽機(jī)制內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java之HashMap.values()轉(zhuǎn)List時的錯誤和正確演示
這篇文章主要介紹了Java之HashMap.values()轉(zhuǎn)List時的錯誤和正確演示,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-03-03
java中線程的sleep()方法和yield()方法的區(qū)別
本文主要介紹了java中線程的sleep()方法和yield()方法的區(qū)別,Thread類的sleep()方法使線程休眠指定時間,不釋放鎖,而yield()提示調(diào)度器當(dāng)前線程愿意讓出CPU資源,不保證立即切換線程,感興趣的可以了解一下2024-10-10
MyBatisPlus使用@TableField注解處理默認(rèn)填充時間的問題
這篇文章主要介紹了MyBatisPlus使用@TableField注解處理默認(rèn)填充時間的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-01-01
Java 語言守護(hù)線程 Daemon Thread使用示例詳解
這篇文章主要為大家介紹了Java 語言守護(hù)線程 Daemon Thread使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10
Java?Cookie與Session實現(xiàn)會話跟蹤詳解
session的工作原理和cookie非常類似,在cookie中存放一個sessionID,真實的數(shù)據(jù)存放在服務(wù)器端,客戶端每次發(fā)送請求的時候帶上sessionID,服務(wù)端根據(jù)sessionID進(jìn)行數(shù)據(jù)的響應(yīng)2022-11-11
SpringBoot 中html的頁面間跳轉(zhuǎn)問題小結(jié)
這篇文章主要介紹了SpringBoot 中html的頁面間跳轉(zhuǎn)問題小結(jié),本文給大家分享兩種方法,結(jié)合實例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2023-10-10

