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时的错误和正确演示

    这篇文章主要介绍了Java之HashMap.values()转List时的错误和正确演示,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • java中线程的sleep()方法和yield()方法的区别

    java中线程的sleep()方法和yield()方法的区别

    本文主要介绍了java中线程的sleep()方法和yield()方法的区别,Thread类的sleep()方法使线程休眠指定时间,不释放锁,而yield()提示调度器当前线程愿意让出CPU资源,不保证立即切换线程,感兴趣的可以了解一下
    2024-10-10
  • Java easyexcel使用教程之导出篇

    Java easyexcel使用教程之导出篇

    EasyExcel是阿里巴巴开源的一个excel处理框架,以使用简单,节省内存著称,下面这篇文章主要给大家介绍了关于Java easyexcel使用教程之导出篇的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-06-06
  • MyBatisPlus使用@TableField注解处理默认填充时间的问题

    MyBatisPlus使用@TableField注解处理默认填充时间的问题

    这篇文章主要介绍了MyBatisPlus使用@TableField注解处理默认填充时间的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • java比较两个list是否相同equals的代码详解

    java比较两个list是否相同equals的代码详解

    在本篇文章里小编给大家分享的是关于java比较两个list是否相同equals的代码详解,有需要的朋友们可以参考学习下。
    2020-02-02
  • Java 语言守护线程 Daemon Thread使用示例详解

    Java 语言守护线程 Daemon Thread使用示例详解

    这篇文章主要为大家介绍了Java 语言守护线程 Daemon Thread使用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-10-10
  • 使用Java第三方实现发送短信功能

    使用Java第三方实现发送短信功能

    这篇文章主要介绍了使用Java第三方实现发送短信功能,在一些开发中,经常需要有给用户发送短信接收验证码的功能,那么在Java中该如何实现呢,今天我们就一起来看一看
    2023-03-03
  • J2ee 高并发情况下监听器实例详解

    J2ee 高并发情况下监听器实例详解

    这篇文章主要介绍了J2ee 高并发情况下监听器实例详解的相关资料,需要的朋友可以参考下
    2017-02-02
  • Java Cookie与Session实现会话跟踪详解

    Java Cookie与Session实现会话跟踪详解

    session的工作原理和cookie非常类似,在cookie中存放一个sessionID,真实的数据存放在服务器端,客户端每次发送请求的时候带上sessionID,服务端根据sessionID进行数据的响应
    2022-11-11
  • SpringBoot 中html的页面间跳转问题小结

    SpringBoot 中html的页面间跳转问题小结

    这篇文章主要介绍了SpringBoot 中html的页面间跳转问题小结,本文给大家分享两种方法,结合实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2023-10-10

最新评论