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
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) 发送邮件]

浙公网安备 33010602011771号