spring事件使用

spring定义事件有两种方式:

  1. 继承ApplicationEvent
java 复制代码
public class MyEvent01 extends ApplicationEvent {

    /**
     * 携带自己的数据
     */
    private String name;

    private Integer age;

    /**
     *
     * @param source 事件源,,事件是由谁发送的
     */
    public MyEvent01(Object source) {
        super(source);
    }
    ...
    }
  1. 随便创建一个类
java 复制代码
public class User {

    private String name;
    private Integer age;

   ...
}

spring监听事件也有两种方式:

  1. 实现ApplicationListener<要监听的事件类型>
java 复制代码
// 范性 ==》 监听器处理的类型
@Component
public class MyListener01 implements ApplicationListener<MyEvent01> {
    @Override
    public void onApplicationEvent(MyEvent01 event) {
        // 获取事件是由哪里发出来的
        Object source = event.getSource();
        System.out.println("source = " + source);
        System.out.println("event my listener01 = " + event);
    }
}
  1. 使用@EventListener(要监听的事件类型)
java 复制代码
@Component
public class MyListener02 {

    /**
     * 指定要监听  这个 user 事件
     * @param user
     */
    @EventListener(User.class)
    public void handleUser(User user){
        System.out.println("user my listener02 = " + user);
    }
}

spring事件发布是通过ApplicationEventPublisher来发布事件,,,

因为ApplicationContext实现了ApplicationEventPublisher,可以直接使用ApplicationContext发布事件

java 复制代码
   @Test
    void contextLoads() {

        User user = new User();
        user.setName("user");
        user.setAge(1);
        context.publishEvent(user);


//        MyEvent01 event01 = new MyEvent01(this);
//        event01.setName("waterkid");
//        event01.setAge(18);
//        context.publishEvent(event01);


    }

或者通xxxAware感知到ApplicationEventPublisher 来发布事件:

java 复制代码
@Component
public class MyEventPublisher implements ApplicationEventPublisherAware {

    private static ApplicationEventPublisher publisher;
    @Override
    public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {

        publisher = applicationEventPublisher;
    }


    public static void publishEvent(Object event){
        publisher.publishEvent(event);
    }


    public static void publishEvent(ApplicationEvent event){
        publisher.publishEvent(event);
    }
}
java 复制代码
  @Test
    public void test01(){
        User user = new User();
        user.setName("user");
        user.setAge(1);
        MyEventPublisher.publishEvent(user);
    }

spring中监听事件,,也可以写在容器外面,,通过ConfigurableApplicationContext去添加监听器:

java 复制代码
@Test
    public void test02(){

        ConfigurableApplicationContext ctx = (ConfigurableApplicationContext) context;

        // 添加监听器
        ctx.addApplicationListener(new ApplicationListener<ApplicationEvent>(){
            @Override
            public void onApplicationEvent(ApplicationEvent event) {
                if (event instanceof MyEvent01){
                    System.out.println("event = " + event);
                }else if(event instanceof AfterTestMethodEvent || event instanceof AfterTestExecutionEvent){
                    // spring测试框架在测试执行过程中,会触发一些列内置事件,,这是框架的设计和重要机制
                    // AfterTestExecutionEvent : 测试方法主体执行完成后,但在清理方法之前
                    // AfterTestMethodEvent :  测试方法完全结束
                }
                else {
                    // spring测试框架在测试执行过程中,会触发一些列内置事件,,这是框架的设计和重要机制
                    // AfterTestExecutionEvent : 测试方法主体执行完成后,但在清理方法之前
                    // AfterTestMethodEvent :  测试方法完全结束
                    System.out.println("其他事件 = " + event);
                }
            }
        });

                MyEvent01 event01 = new MyEvent01(this);
        event01.setName("waterkid");
        event01.setAge(18);
        context.publishEvent(event01);
    }
相关推荐
卓怡学长8 分钟前
w198基于springboot始于足下健康打卡平台的设计与实现
java·spring boot·spring·intellij-idea
阿狗童鞋22 分钟前
Java并发编程实战指南
java·开发语言
子兮曰32 分钟前
Node.js 50个优势场景盘点:一个人单干,为啥我多数时候只用它
前端·后端
IT_陈寒33 分钟前
我花3小时debug,就因为JavaScript这个隐式转换坑
前端·人工智能·后端
Joe_Wang543 分钟前
【从0到1学习JVM · 15】对象在堆里来回倒腾,究竟怎样才会进老年代?
java·jvm·学习·垃圾回收
程序猿阿越1 小时前
containerd如何拉取镜像
后端·kubernetes·源码阅读
一条小小yu1 小时前
为什么使用springboot
java·spring boot·后端
Elastic 中国社区官方博客1 小时前
Kubernetes attributes processor v1:它对 EDOT Collector 意味着什么
java·大数据·elasticsearch·搜索引擎·贪心算法·kubernetes·全文检索
Sarvartha1 小时前
对象创建与引用
java·开发语言
香瓜子rd1 小时前
MySQL InnoDB 并发控制核心原理:事务、隔离级别、MVCC 与锁机制
数据库·后端