使用Spring事件监听机制实现跨模块调用
最近一个项目,有两个模块,A模块需要依赖B模块,但现在B模块有地方需要调用A模块的方法,如果直接依赖,又会产生循环依赖问题。最终选择使用spring的事件监听来解决该问题。
思路就是,B模块去发布事件,A中监听,得到数据后,通过引用返回给B。
首先是定义事件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| 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; }
public StringBuilder getGriddingName() { return griddingName; }
public Integer getGriddingId() { return griddingId; }
public String getMessage() { return message; } }
|
然后在B中去发布事件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| @Autowired ApplicationEventPublisher applicationEventPublisher;
@Override public SysUserVO getUserInfo(Long userId) { SysUser user = getById(userId);
Integer griddingId = user.getGriddingId(); StringBuilder griddingName= new 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中监听事件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| @EventListener public void getGriddingNameByUserIdEventListener(getUserInfoEvent event) { System.out.println(event.getMessage()); Integer griddingId = event.getGriddingId(); StringBuilder griddingName = event.getGriddingName();
GriddingArea griddingArea = getOne(new LambdaQueryWrapper<GriddingArea>().eq(GriddingArea::getId, griddingId));
griddingName.append(griddingArea.getGriddingName());
System.out.println("griddingName"+griddingName); }
|
非常好用👍