Spring事件机制(转载:https://mp.weixin.qq.com/s/cFYiwCt8xcGXJY7IuFIQig)

Spring 基于观察者模式,实现了自身的事件机制,由三部分组成:

事件 ApplicationEvent:通过继承它,实现自定义事件。另外,通过它的 source 属性可以获取事件源,timestamp 属性可以获得发生时间。
事件发布者 ApplicationEventPublisher:通过它,可以进行事件的发布。
事件监听器 ApplicationListener:通过实现它,进行指定类型的事件的监听。

可见 https://github.com/YunaiV/SpringBoot-Labs 的 lab-54 目录。

创建 UserRegisterEvent 事件类,继承 ApplicationEvent 类,用户注册事件。代码如下:
public class UserRegisterEvent extends ApplicationEvent {

/**
 * 用户名
 */
private String username;

public UserRegisterEvent(Object source) {
    super(source);
}

public UserRegisterEvent(Object source, String username) {
    super(source);
    this.username = username;
}

public String getUsername() {
    return username;
}

}

创建 UserService 类,用户 Service。代码如下:
@Service
public class UserService implements ApplicationEventPublisherAware { // <1>

private Logger logger = LoggerFactory.getLogger(getClass());

private ApplicationEventPublisher applicationEventPublisher;

@Override
public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {
    this.applicationEventPublisher = applicationEventPublisher;
}

public void register(String username) {
    // ... 执行注册逻辑
    logger.info("[register][执行用户({}) 的注册逻辑]", username);

    // <2> ... 发布
    applicationEventPublisher.publishEvent(new UserRegisterEvent(this, username));
}

}

创建 EmailService 类,邮箱 Service。代码如下:
@Service
public class EmailService implements ApplicationListener { // <1>

private Logger logger = LoggerFactory.getLogger(getClass());

@Override
@Async // <3>
public void onApplicationEvent(UserRegisterEvent event) { // <2>
    logger.info("[onApplicationEvent][给用户({}) 发送邮件]", event.getUsername());
}

}

创建 CouponService 类,优惠劵 Service。代码如下:
@Service
public class CouponService {

private Logger logger = LoggerFactory.getLogger(getClass());

@EventListener // <1>
public void addCoupon(UserRegisterEvent event) {
    logger.info("[addCoupon][给用户({}) 发放优惠劵]", event.getUsername());
}

}

创建 DemoController 类,提供 /demo/register 注册接口。代码如下:

@RestController
@RequestMapping("/demo")
public class DemoController {

@Autowired
private UserService userService;

@GetMapping("/register")
public String register(String username) {
    userService.register(username);
    return "success";
}

}

① 执行 DemoApplication 类,启动项目。

② 调用 http://127.0.0.1:8080/demo/register?username=yudaoyuanma 接口,进行注册。IDEA 控制台打印日志如下:

UserService 发布 UserRegisterEvent 事件

2020-04-06 13:09:39.145 INFO 18615 --- [nio-8080-exec-1] c.i.s.l.eventdemo.service.UserService : [register][执行用户(yudaoyuanma) 的注册逻辑]

CouponService 监听处理该事件

2020-04-06 13:09:39.147 INFO 18615 --- [nio-8080-exec-1] c.i.s.l.eventdemo.service.CouponService : [addCoupon][给用户(yudaoyuanma) 发放优惠劵]

EmailService 监听处理该事件

2020-04-06 13:09:39.154 INFO 18615 --- [ task-1] c.i.s.l.eventdemo.service.EmailService : [onApplicationEvent][给用户(yudaoyuanma) 发送邮件]

posted @ 2020-11-10 11:40  harbuor  阅读(103)  评论(0)    收藏  举报