栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

springBoot监听器ApplicationEventPublisherAware应用

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

springBoot监听器ApplicationEventPublisherAware应用

好处

监听器可以使核心业务与子业务进行解耦,也方便后期的业务的扩展。如新用户注册之后,发送邮件或短信,此时可以在保存用户之后,发布一个新用户的注册成功事件,通过监听该事件来实现发送邮件或短信的功能。后期新增一个对新用户进行xxx功能,此时可以新写一个监听注册成功事件的监听器,来处理新的业务逻辑,而不需要修改之前的注册逻辑。

代码 实体类
package com.erp.payroll.evenlistener;


public class User {
    private Integer id;
    private String name;
    private String phoneNum;
    private String email;
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getPhoneNum() {
        return phoneNum;
    }
    public void setPhoneNum(String phoneNum) {
        this.phoneNum = phoneNum;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    @Override
    public String toString() {
        return "User [id=" + id + ", name=" + name + ", phoneNum=" + phoneNum + ", email=" + email + "]";
    }
}

controller层
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;



@RestController
@RequestMapping("/user")
public class UserRegisterController {
    @Autowired
    private UserRegisterService userRegisterService;
    @RequestMapping("/register")
    public String register(User user) {
        //进行注册
        userRegisterService.register(user);
        return "[controller]注册用户成功!";

    }
}
Service层:执行用户注册,并发布事件
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.context.ApplicationEventPublisherAware;
import org.springframework.stereotype.Service;



@Service
public class UserRegisterService implements ApplicationEventPublisherAware {

    private ApplicationEventPublisher applicationEventPublisher;

    public boolean register(User user) {

        //用户注册
        System.out.println("[service]用户["  + user + "]注册成功!");

        //消息发布
        applicationEventPublisher.publishEvent(new UserRegisterEvent(this, user));

        return true;
    }

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

    }
}
事件监听:监听到事件发布后,自动执行onApplicationEvent方法,所以该类需要有IOC来管理,类上要加@Component注解
import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;


@Component
public class EventListener implements ApplicationListener {

    @Override
    public void onApplicationEvent(UserRegisterEvent event) {

        //发邮件
        System.out.println("正在发送邮件至: " + event.getUser().getEmail());

        //发短信
        System.out.println("正在发短信到: " + event.getUser().getPhoneNum());
    }
}

可以使用注解
@EventListener
使用在类上表示是监听方法(未验证)

//监听事件
@EventListener
public void listenEvent(UserRegisterEvent event) {
        //发邮件
        System.out.println("正在发送邮件至: " + event.getUser().getEmail());

        //发短信
        System.out.println("正在发短信到: " + event.getUser().getPhoneNum());
}
事件类
import org.springframework.context.ApplicationEvent;


public class UserRegisterEvent extends ApplicationEvent {
    private static final long serialVersionUID = -5481658020206295565L;
    private User user;
    //谁发布的这个事件,souce就是谁(对象)
    public UserRegisterEvent(Object source, User user) {
        super(source);
        this.user = user;
    }
    public User getUser() {
        return user;
    }
}
执行过程

controller层调用service中的注册方法触发监听事件,并创建这个事件类(内部可做其他操作),然后.publishEvent发布事件。
监听这个事件类的监听器就会监听到这个事件,然后onApplicationEvent执行内部方法。

ApplicationEventPublisherAware事件发布详解.

注意
1、监听器方法中一定要try-catch异常,否则会造成发布事件(有事务的)的方法进行回滚
2、可以使用@Order注解来控制多个监听器的执行顺序,@Order传入的值越小,执行顺序越高
3、对于需要进行事务监听或不想try-catch runtime异常,可以使用@TransactionalEventListener注解
@TransactionalEventListener 监听器

如果事件的发布不是在事务(@Transactional)范围内,则监听不到该事件,除非将fallbackExecution标志设置为true(@TransactionalEventListener(fallbackExecution = true));如果在事务中,可以选择在事务的哪个阶段来监听事件,默认在事务提交后监听。

修改监听事务的范围:@TransactionalEventListener(phase = TransactionPhase.AFTER_COMPLETION)
可以在监听器中重新开一个事务
	@TransactionalEventListener(phase = TransactionPhase.AFTER_COMPLETION)
    public void listenEvent1(UserRegisterEvent event) {
        divide(event);
    }
    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void divide(UserRegisterEvent event) {
        //发邮件
        System.out.println("正在发送邮件至: " + event.getUser().getEmail());

        //发短信
        System.out.println("正在发短信到: " + event.getUser().getPhoneNum());
    }
以上事件都是同步,如果需要异步则需要开启异步支持,在监听器方法加上@Async 注解即可。 一旦开始异步执行,方法的异常将不会抛出,只能在方法内部处理。如需在方法外处理异常:Async 异常处理在文章最后.

SpringBoot 发布ApplicationEventPublisher和监听ApplicationEvent事件.

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/632458.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号