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);
    }
相关推荐
小溪学编程5 分钟前
Java ListIterator 接口详解:双向遍历与列表修改的利器
java·开发语言·windows
得物技术8 分钟前
企业级 MultiAgent 落地:Plan 模式与主子 Agent 协作|得物技术
java·程序员·架构
程序员清风9 分钟前
为什么不推荐走Agent开发?
java·后端·面试
我命由我123459 分钟前
Compose Codelab 学习 - Jetpack Compose 中的状态
android·java·java-ee·android studio·android jetpack·android-studio·android runtime
土司大王10 分钟前
LeetCode hot100——全排列
java·算法·leetcode
sbjdhjd10 分钟前
在 8 字符、字母数字过滤与 PHP 版本差异下复盘临时文件命令执行链 | (8字符绕过)
android·java·开发语言·安全·web安全·数据挖掘·php
秋饼27 分钟前
Spring AI 2.0 多模型路由网关:Astra/Sol 到国产模型的智能调度与降级
java·ai·技术分享·后端开发
Wang's Blog30 分钟前
Java框架快速入门: Spring Security+OAuth2之密码存储安全进化与实践
java·安全·spring
小七在进步38 分钟前
C++入门(3)
android·java·c++
前端 贾公子40 分钟前
Milvus使用指南 (下)
java·服务器·前端