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详解RocketMQ实现广播消息流程

    Springboot详解RocketMQ实现广播消息流程

    RocketMQ作为一款纯java、分布式、队列模型的开源消息中间件,支持事务消息、顺序消息、批量消息、定时消息、消息回溯等,本篇我们了解如何实现广播消息
    2022-06-06
  • Springboot启动原理和自动配置原理解析

    Springboot启动原理和自动配置原理解析

    这篇文章主要介绍了Springboot启动原理和自动配置原理解析,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-04-04
  • java基于odbc连接oracle的实现方法

    java基于odbc连接oracle的实现方法

    这篇文章主要介绍了java基于odbc连接oracle的实现方法,结合实例形式分析了连接操作的具体步骤与相关实现技巧,需要的朋友可以参考下
    2016-09-09
  • SpringBoot项目启动时提示程序包不存在和找不到符号的处理方法

    SpringBoot项目启动时提示程序包不存在和找不到符号的处理方法

    最近接手同事开发的一个Springboot工作项目,从svn上整体拉取下来后,构建完成后,启动的时候遇到了程序包找不到的情况,所以本文记录了SpringBoot项目启动时提示程序包不存在和找不到符号的处理方法,需要的朋友可以参考下
    2024-05-05
  • 学习Java之Java中的异常处理机制详解

    学习Java之Java中的异常处理机制详解

    在本文中,小编将带领大家来学习Java的异常处理机制,包括异常机制、异常类型、如何捕获异常、如何抛出异常以及如何创建自定义异常等核心内容,感兴趣的同学跟着小编一起来看看吧
    2023-08-08
  • 如何创建SpringBoot项目

    如何创建SpringBoot项目

    这篇文章主要介绍了如何创建SpringBoot项目,帮助大家更好的学习和使用springboot框架,感兴趣的朋友可以了解下
    2021-01-01
  • ThreadPoolExecutor核心线程数和RocketMQ消费线程调整详解

    ThreadPoolExecutor核心线程数和RocketMQ消费线程调整详解

    这篇文章主要介绍了ThreadPoolExecutor核心线程数和RocketMQ消费线程调整详解,Rocketmq 消费者在高峰期希望手动减少消费线程数,通过DefaultMQPushConsumer.updateCorePoolSize方法可以调用内部的setCorePoolSize设置多线程核心线程数,需要的朋友可以参考下
    2023-10-10
  • Java花式解决'分割回文串 ii'问题详解

    Java花式解决'分割回文串 ii'问题详解

    最学习动态规划思想的路上,遇见了‘分割回文串问题’,如临大敌啊,题目听起来蛮简单,思考起来却也没那么容易,本文将为大家详细介绍几种解决分割回文串 ii问题的办法,需要的可以参考一下
    2021-12-12
  • Java解决浮点数计算不精确问题的方法详解

    Java解决浮点数计算不精确问题的方法详解

    在 Java 中,浮点数计算不精确问题指的是使用浮点数进行运算时,由于浮点数的内部表示方式和十进制数的表示方式存在差异,导致计算结果可能出现误差,本文就给大家介绍一下Java如何解决浮点数计算不精确问题,需要的朋友可以参考下
    2023-09-09
  • Maven中jar包冲突原理与解决办法

    Maven中jar包冲突原理与解决办法

    这篇文章主要介绍了Maven中jar包冲突原理与解决办法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09

最新评论