Spring 事件监听机制实现跨模块调用的思路详解
更新时间:2024年05月28日 14:50:26 作者:しろいし
之前一个项目,有两个模块,A 模块需要依赖 B 模块,但现在 B 模块有地方需要调用 A 模块的方法,如果直接依赖,又会产生循环依赖问题,最终选择使用 spring 的事件监听来解决该问题,下面给大家介绍Spring 事件监听机制实现跨模块调用的思路,感兴趣的朋友一起看看吧
之前一个项目,有两个模块,A 模块需要依赖 B 模块,但现在 B 模块有地方需要调用 A 模块的方法,如果直接依赖,又会产生循环依赖问题。最终选择使用 spring 的事件监听来解决该问题。
思路就是,B 模块去发布事件,A 中监听,得到数据后,通过引用返回给 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 中去发布事件
@Autowired
ApplicationEventPublisher applicationEventPublisher; //这个必须注入
@Override
public SysUserVO getUserInfo(Long userId) {
SysUser user = getById(userId);
Integer griddingId = user.getGriddingId();
StringBuilder griddingName= new StringBuilder(); //使用stringbuilder进行引用字符串操作,来获取需要的值
//上面是业务相关
getUserInfoEvent event = new getUserInfoEvent(this,"发布“获取用户信息”事件",griddingId,griddingName); //定义事件
applicationEventPublisher.publishEvent(event); //发布事件
//下面是获取到数据之后的操作,不重要
//这里事件是同步进行的
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 中监听事件
@EventListener
public void getGriddingNameByUserIdEventListener(getUserInfoEvent event) { //参数必须填写要监听的事件类,事件发布后这边就会监听到
//形参event中存有传递的相关数据
System.out.println(event.getMessage()); //会打印出---发布“获取用户信息”事件
//下面为个人业务相关代码
Integer griddingId = event.getGriddingId();
StringBuilder griddingName = event.getGriddingName();
//再通过网格id来查找对应的网格信息
GriddingArea griddingArea = getOne(new LambdaQueryWrapper<GriddingArea>().eq(GriddingArea::getId, griddingId));
griddingName.append(griddingArea.getGriddingName()); //使用同一个StringBuilder对象来操作,这里把获取到的字符串存入后,事件发布者那边就能得到数据了。
System.out.println("griddingName"+griddingName);
}非常好用👍
到此这篇关于 Spring 事件监听机制实现跨模块调用的文章就介绍到这了,更多相关 Spring 事件监听机制内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
Java之HashMap.values()转List时的错误和正确演示
这篇文章主要介绍了Java之HashMap.values()转List时的错误和正确演示,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2023-03-03
java中线程的sleep()方法和yield()方法的区别
本文主要介绍了java中线程的sleep()方法和yield()方法的区别,Thread类的sleep()方法使线程休眠指定时间,不释放锁,而yield()提示调度器当前线程愿意让出CPU资源,不保证立即切换线程,感兴趣的可以了解一下2024-10-10
MyBatisPlus使用@TableField注解处理默认填充时间的问题
这篇文章主要介绍了MyBatisPlus使用@TableField注解处理默认填充时间的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2022-01-01
Java 语言守护线程 Daemon Thread使用示例详解
这篇文章主要为大家介绍了Java 语言守护线程 Daemon Thread使用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪2022-10-10


最新评论