用户注册后执行 -> ①发送注册成功邮件、②发送优惠券
不管后面的①②执行是否成功,都应保证用户注册功能不受影响。
/*
* 就是自定义的一个实体类,spring会默认将其包装在PayloadApplicationEvent中
* 当使用@EventListener时,需指定指定参数value或class,防止多个事件冲突
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class UserRegisterEvent {
//用户名
private String userName;
}
监听类
/**
* 多个监听器一定指定事件类型,防止发生冲突
* 如:@EventListener(classes = UserRegisterEvent.class)
*/
@Component
public class UserRegisterListener {
/*
* 只监听UserRegisterEvent事件
* 使用Order来表示同一事件的执行顺序
*/
@EventListener(classes = UserRegisterEvent.class)
@Order(2)
public void sendMail(UserRegisterEvent event) {
System.out.println(Thread.currentThread().getName() + " ---> " + String.format("给用户【%s】发送注册成功邮件!", event.getUserName()));
}
@Order(1)
@EventListener(classes = UserRegisterEvent.class)
public void sendCompon(UserRegisterEvent event) {
System.out.println(Thread.currentThread().getName() + " ---> " + String.format("给用户【%s】发送优惠券!", event.getUserName()));
}
/*
* Object类型不要写,所有的事件他都会执行
*/
@EventListener(classes = Object.class)
@Order(3)
public void sendMail1(Object event) {
System.out.println(Thread.currentThread().getName() + " ---> " + "我也执行了111111111!");
}
/*
* 只监听GoodsPriceEvent事件
* 也就是当触发上面的UserRegisterEvent事件时,不会执行,避免了冲突
*/
@EventListener(classes = GoodsPriceEvent.class)
@Order(4)
public void sendMail2(Object event) {
System.out.println(Thread.currentThread().getName() + " ---> " + "我也执行了222222222!");
}
}
事件广播器
/*
* 这就是你的service业务处理类
* 使用ApplicationEventPublisher发送
* 当然也可以使用ApplicationContext发送,因为ApplicationContext继承了ApplicationEventPublisher
*/
@Service
public class UserRegisterService {
/*
* 和ApplicationContext任选其一即可
*/
@Resource
private ApplicationEventPublisher applicationEventPublisher;
/*
* 和ApplicationEventPublisher任选其一即可
*/
@Resource
private ApplicationContext applicationContext;
/**
* 负责用户注册及发布事件的功能
*
* @param userName 用户名
*/
public void registerUser(String userName) {
//用户注册(将用户信息入库等 *** 作)
System.out.println(String.format("用户【%s】注册成功", userName));
//发布注册成功事件
applicationEventPublisher.publishEvent(new UserRegisterEvent(userName));
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)