首页 > 其他分享 >Spring的事件机制

Spring的事件机制

时间:2022-10-31 17:37:24浏览次数:47  
标签:用户注册 Spring User 机制 事件 public user

Spring的事件包含三部分

  • 事件(ApplicationEvent):继承自 jdk 的 EventObject,所有的事件都需要继承 ApplicationEvent,并且通过构造器参数 source 得到事件源.
  • 应用事件监听器(ApplicationListener):继承自 jdk 的 EventListener,所有的监听器都要实现这个接口
  • 事件发布者(ApplicationEventPublisher,ApplicationContext 实现了 ApplicationEventPublisher 接口):具体实现类是 SimpleApplicationEventMulticaster,在 Spring 中维护监听者。ApplicationEventMulticaster#multicastEvent方法将事件传给监听器

Spring默认事件类型

  • ContextRefreshedEvent:在初始化或刷新时 ApplicationContext 发布
  • ContextStartedEvent:通过在 ConfigurableApplicationContext 接口上使用 start() 方法启动 ApplicationContext 时发布,通常,此信号用于在显式停止后重新启动 bean
  • ContextStoppedEvent:使用 ConfigurableApplicationContext 接口上的 stop()方法停止 ApplicationContext 时发布,停止的上下文可以通过 start() 调用重新启动
  • ContextClosedEvent:通过使用 ConfigurableApplicationContext 接口上的 close() 方法或通过 JVM shutdown hook钩子函数在 ApplicationContext 被关闭时发布。在这里,“关闭”意味着所有单例 bean 都将被销毁
  • RequestHandledEvent:一个特定于 web 的事件,它告诉所有 bean 一个 HTTP 请求已经得到了服务。此事件在请求完成后发布。此事件仅适用于使用 Spring 的 DispatcherServlet 的 Web 应用程序

自定义事件

注解方式

新建一个用户注册事件,继承ApplicationEvent

public class UserRegisterEvent extends ApplicationEvent {

    public UserRegisterEvent(User user) {
        super(user);
    }

}

创建两个事件监听器,@EventListener注解用在方法上

@Slf4j
@Service
public class UserRegisterListener {
    @EventListener
    public void sendMsg(UserRegisterEvent userRegisterEvent) {
        User user = (User) userRegisterEvent.getSource();
        log.info("发送短信,手机号{}", user.getPhone());
    }

    @EventListener
    public void sendEmail(UserRegisterEvent userRegisterEvent) {
        User user = (User) userRegisterEvent.getSource();
        log.info("发送邮箱,邮箱{}", user.getEmail());
    }
}

在用户注册逻辑完成后,发布用户注册事件

@Service
public class UserServiceImpl {

    public final ApplicationEventPublisher applicationEventPublisher;

    public UserServiceImpl(ApplicationEventPublisher applicationEventPublisher) {
        this.applicationEventPublisher = applicationEventPublisher;
    }

    public void register() {
        log.info("用户注册");
        // 发送用户注册事件
        applicationEventPublisher.publishEvent(new UserRegisterEvent(User.builder().name("lisi").email("[email protected]").phone("8008208820").build()));
    }
}

运行结果:

可以看到事件已经发布,并且监听成功。
但是从图上可以看到,主逻辑和监听事件的线程是同一个,也就是在同一个线程中执行,如果想多线程做异步处理,该怎么做?

标签:用户注册,Spring,User,机制,事件,public,user
From: https://www.cnblogs.com/back-garden/p/16844353.html

相关文章

  • spring学习笔记
    2022-10-31java历程:“Java之父”JamesoslinSUN公司Oak(橡树)机顶盒一个小型万维网浏览器WebRunner(后来改名为Hot-2)1997日,JavaOne会议召开,参与者逾万人,创......
  • Spring Boot中使用拦截器
    简介拦截器的原理很简单,是AOP的一种实现,专门拦截对动态资源的后台请求,即拦截对控制层的请求。使用场景比较多的是判断用户是否有权限请求后台,更拔高一层的使用场景也有,比......
  • 2022.10.21----vscode-自定义事件
     vscode预览模式关闭,就能打开新标签页(43条消息)vscode新窗口打开文件-CSDN (43条消息)如何在vscode中打开新文件夹不覆盖上一个窗口标签_发呆的薇薇°的博客-......
  • kafka服务端设置用户和密码登录及springboot访问实现
    1、先安装zookeeper,不会的可以去查一下。2、解压并放到目录下,改名tarzxvfkafka_2.12-2.4.0.tgz-C/datamvkafka_2.12-2.4.0kafka3、修改kafka配置文件server.......
  • 【WPF 数据验证机制】三、INotifyDataErrorInfo接口+DataAnnotation数据特性实现model
    环境vs2022+.net6.0+wpf+MVVM+EFcore6.0MVVM验证示意图INotifyDataErrorInfo接口功能publicinterfaceINotifyDataErrorInfo{boolHasErrors{get;}//提供......
  • Spring-7-配置文件
    文章目录​​1.为什么要用配置文件​​​​2.怎么用包含配置文件​​1.为什么要用配置文件有多个applicationContext.xml可以分为服务层,dao和其他方便生成的对象便于管理2.......
  • Spring-6-小总结
    ......
  • Spring-8-注解(对象的创建)
    文章目录​​注解的di​​​​1.使用注解第一步加入maven的依赖(spring-context)​​​​2.在类里面加spring的注解​​​​创建对象1.@Context(value="对象名")==@Context("对......
  • Spring Security 认证流程
    SpringSecurity认证流程   本文以用户名/密码验证方式为例,讲解SpringSecurity的认证流程,在此之前,需要你了解SpringSecurity用户名/密码认证的基本配置。Sp......
  • Springboot整合mybatis-plus-2增删改查
    文章目录​​一、插入​​​​1.主键id配置自增的​​​​2.时间等自动填充​​​​1.直接在数据字段设置即可​​​​2.使用ioc反射原理​​​​二、改(update)​​​​三、......