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);
    }
相关推荐
快手技术几秒前
打破信息茧房!快手搜索多视角正样本增强引擎 CroPS 入选 AAAI 2026 Oral
后端·算法·架构
yaoxin5211231 分钟前
286. Java Stream API - 使用Stream.iterate(...)创建流
java·开发语言
qq_12498707534 分钟前
基于springboot的鸣珮乐器销售网站的设计与实现(源码+论文+部署+安装)
java·spring boot·后端·spring·毕业设计·计算机毕业设计
海南java第二人4 分钟前
SpringBoot核心注解@SpringBootApplication深度解析:启动类的秘密
java·spring boot·后端
win x9 分钟前
Redis集群
java·数据库·redis
r_oo_ki_e_9 分钟前
java23--异常
java·开发语言
百度地图汽车版16 分钟前
【智图译站】基于异步时空图卷积网络的不规则交通预测
前端·后端
qq_124987075320 分钟前
基于Spring Boot的“味蕾探索”线上零食购物平台的设计与实现(源码+论文+部署+安装)
java·前端·数据库·spring boot·后端·小程序
爬山算法24 分钟前
Hibernate(38)如何在Hibernate中配置乐观锁?
android·java·hibernate
江上月51328 分钟前
JMeter中级指南:从数据提取到断言校验全流程掌握
java·前端·数据库