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);
    }
相关推荐
一 乐15 分钟前
家政服务管理系统|基于springboot + vue家政服务管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·论文·毕设·家政服务管理系统
IT_陈寒17 分钟前
Vite热更新失效?可能你在用Windows
前端·人工智能·后端
碳基硅坊1 小时前
Spring AI:把大模型接进 Spring 应用
java·人工智能·spring ai
椰椰椰耶1 小时前
[SpringCloud][14]OpenFeign参数传递方法
后端·spring·spring cloud
黄毛火烧雪下1 小时前
Java 核心知识点总结(一)
java·开发语言
onething3652 小时前
Spring Boot + Spring AI 从入门到实战:7天转型计划 Day 3 —— 消息表设计 + 级联删除 + 事务管理
人工智能·后端
荣江2 小时前
Hermes Agent 代码仓库打包工具使用指南(repomix-rs 高性能版)
后端
王某某人2 小时前
LangChain4j 入门:Java 程序员的第一个 AI 对话程序
人工智能·后端
码农刚子2 小时前
从零开始:在 Windows 服务器上部署 Node.js 项目(小白实战教程)
后端·node.js
Cache技术分享2 小时前
435. Java 日期时间 API - Clock 灵活获取当前时间
前端·后端