Spring Boot ApplicationListener(监听器)的使用

4,193 阅读1分钟

需求

当下了一个订单后,通知用户下单成功

创建 Spring Boot 项目,依赖如下,其余省略

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>

创建事件 ApplicationEvent

@Getter
public class PushOrderEvent extends ApplicationEvent {

    private String orderNo;

    private Long userId;

    public PushOrderEvent(Object source, String orderNo,Long userId) {
        super(source);
        this.orderNo = orderNo;
        this.userId = userId;
    }
}

创建监听器 ApplicationListener

实现接口方式
@Slf4j
@Component
public class PushOrderListener implements ApplicationListener<PushOrderEvent> {


    @Override
    public void onApplicationEvent(PushOrderEvent event) {

        log.info("{}用户下了一个订单{}", event.getUserId(), event.getOrderNo());
    }
}
注解方式
@Slf4j
@Component
public class AnnotationPushOrderListener {

    @EventListener
    public void handler(PushOrderEvent event) {

        log.info("{}用户下了一个订单{}", event.getUserId(), event.getOrderNo());
    }

}

发布事件

@Slf4j
@RestController
@RequestMapping("order")
public class OrderController {

    @Autowired
    private ApplicationEventPublisher publisher;

    @PostMapping("push")
    public ResponseEntity pushOrder() {
        String orderNo = UUID.randomUUID().toString();

        // 发布事件
        publisher.publishEvent(new PushOrderEvent(this, orderNo, 666666L));

        return ResponseEntity.ok(orderNo);
    }

}

测试

请求接口

http://127.0.0.1:8080/order/push

结果,控制台输出

666666用户下了一个订单211f238e-7517-4786-83ca-057c64545c65

源码

点击这里