假设现在需求是用户下订单后,发送一个短信通知他。如果订单模块和短信模块没有关联的情况下,我们该如何使用呢?我们可以基于Spring提供的ApplicationListener 来处理这个问题。
1.首先要一个对象来封装事件相关的信息,比如用户下单的用户名。
/**
* @author qinxun
* @date 2023-04-24
* @Descripion: 用户下单成功的事件
*/
@Getter
public class OrderSuccessEvent {
/**
* 用户名
*/
private final String username;
public OrderSuccessEvent(String username){
this.username = username;
}
}
2.创建一个事件的监听逻辑 一般处于其他模块中
/**
* @author qinxun
* @date 2023-04-24
* @Descripion: 用户下单成功的事件监听 一般位于其他模块
*/
@Slf4j
@Component
public class OrderSuccessEventListener {
@EventListener
public void handleNotifyEvent(OrderSuccessEvent event){
log.info("监听用户下单成功事件:{}下单成功",event.getUsername());
log.info("发送短信");
}
}
3.测试
/**
* @author qinxun
* @date 2023-04-24
* @Descripion: 用户下单测试 控制层
*/
@RestController
public class TestController {
@Autowired
private ApplicationContext applicationContext;
/**
* 模拟用户下单
* @param username 用户名
*/
@GetMapping("/order")
public void publishEvent(String username){
// 发布用户下单成功的事件
applicationContext.publishEvent(new OrderSuccessEvent(username));
}
}
4.测试 浏览器访问:http://localhost:8080/order?username=qx
2023-04-24 09:16:38.789 INFO 7588 --- [nio-8080-exec-1] c.e.a.l.OrderSuccessEventListener : 监听用户下单成功事件:qx下单成功
2023-04-24 09:16:38.789 INFO 7588 --- [nio-8080-exec-1] c.e.a.l.OrderSuccessEventListener : 发送短信