Spring中@EventListener使用

Spring中@EventListener使用,第1张

场景

用户注册后执行 -> ①发送注册成功邮件、②发送优惠券
不管后面的①②执行是否成功,都应保证用户注册功能不受影响。

使用 事件类
/*
 * 就是自定义的一个实体类,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));
    }

}

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/734875.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-27
下一篇 2022-04-27

发表评论

登录后才能评论

评论列表(0条)

保存