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 事件监听机制内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
SpringBoot项目启动时提示程序包不存在和找不到符号的处理方法
最近接手同事开发的一个Springboot工作项目,从svn上整体拉取下来后,构建完成后,启动的时候遇到了程序包找不到的情况,所以本文记录了SpringBoot项目启动时提示程序包不存在和找不到符号的处理方法,需要的朋友可以参考下2024-05-05ThreadPoolExecutor核心线程数和RocketMQ消费线程调整详解
这篇文章主要介绍了ThreadPoolExecutor核心线程数和RocketMQ消费线程调整详解,Rocketmq 消费者在高峰期希望手动减少消费线程数,通过DefaultMQPushConsumer.updateCorePoolSize方法可以调用内部的setCorePoolSize设置多线程核心线程数,需要的朋友可以参考下2023-10-10
最新评论