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進行引用字符串操作,來獲取需要的值
//上面是業(yè)務相關(guān)
getUserInfoEvent event = new getUserInfoEvent(this,"發(fā)布“獲取用戶信息”事件",griddingId,griddingName); //定義事件
applicationEventPublisher.publishEvent(event); //發(fā)布事件
//下面是獲取到數(shù)據(jù)之后的操作,不重要
//這里事件是同步進行的
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è)務相關(guān)代碼
Integer griddingId = event.getGriddingId();
StringBuilder griddingName = event.getGriddingName();
//再通過網(wǎng)格id來查找對應的網(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結(jié)合經(jīng)緯度位置計算目標點的日出日落時間詳解
這篇文章主詳細講解了如何基于目標點的經(jīng)緯度計算日出日落時間,提供了在線API和Java庫兩種計算方法,并通過實際案例展示了其應用,需要的朋友可以參考下2025-01-01
SpringBoot實現(xiàn)海量數(shù)據(jù)高效實時搜索功能
我們都知道隨著業(yè)務系統(tǒng)的發(fā)展和使用,數(shù)據(jù)庫存儲的業(yè)務數(shù)據(jù)量會越來越大,逐漸成為了業(yè)務系統(tǒng)的瓶頸,本文給大家介紹了Spring Boot業(yè)務系統(tǒng)如何實現(xiàn)海量數(shù)據(jù)高效實時搜索,文中有詳細的代碼示例,需要的朋友可以參考下2023-10-10

