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实现XML增加元素操作简单示例

    java实现XML增加元素操作简单示例

    这篇文章主要介绍了java实现XML增加元素操作,结合简单实例形式分析了java针对xml格式数据的读取、遍历、创建等操作技巧,需要的朋友可以参考下
    2017-02-02
  • 如何用Java结合经纬度位置计算目标点的日出日落时间详解

    如何用Java结合经纬度位置计算目标点的日出日落时间详解

    这篇文章主详细讲解了如何基于目标点的经纬度计算日出日落时间,提供了在线API和Java库两种计算方法,并通过实际案例展示了其应用,需要的朋友可以参考下
    2025-01-01
  • 深度理解Java中volatile的内存语义

    深度理解Java中volatile的内存语义

    前面我们已经讲过了volatile的作用、底层实现与内存屏障,下面就总结一下整个流程,文中有非常详细的介绍及图文示例,需要的朋友可以参考下
    2021-06-06
  • SpringBoot实现海量数据高效实时搜索功能

    SpringBoot实现海量数据高效实时搜索功能

    我们都知道随着业务系统的发展和使用,数据库存储的业务数据量会越来越大,逐渐成为了业务系统的瓶颈,本文给大家介绍了Spring Boot业务系统如何实现海量数据高效实时搜索,文中有详细的代码示例,需要的朋友可以参考下
    2023-10-10
  • Spring框架事务属性中事务隔离级别与传播行为全面讲解

    Spring框架事务属性中事务隔离级别与传播行为全面讲解

    这篇文章主要介绍了Spring框架声明式事务的事务隔离级别和事务传播行为,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2022-11-11
  • 解读Spring-boot的debug调试

    解读Spring-boot的debug调试

    这篇文章主要介绍了解读Spring-boot的debug调试,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12
  • Java中几种常用数据库连接池的使用

    Java中几种常用数据库连接池的使用

    数据库连接池在编写应用服务是经常需要用到的模块,太过频繁的连接数据库对服务性能来讲是一个瓶颈,使用缓冲池技术可以来消除这个瓶颈,本文就来介绍Java常见的几种,感兴趣的可以了解一下
    2021-05-05
  • Spring在代码中获取bean的几种方式详解

    Spring在代码中获取bean的几种方式详解

    这篇文章主要介绍了Spring在代码中获取bean的几种方式详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-08-08
  • 详解Spring Boot 项目中的 parent

    详解Spring Boot 项目中的 parent

    这篇文章主要介绍了Spring Boot中parent作用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • java编程简单获取图片像素的方法

    java编程简单获取图片像素的方法

    这篇文章主要介绍了java编程简单获取图片像素的方法,涉及Java针对图片的读取与属性获取技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-11-11

最新评论