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);
    }
相关推荐
短剑重铸之日1 小时前
《ShardingSphere解读》07 读写分离:如何集成分库分表+数据库主从架构?
java·数据库·后端·架构·shardingsphere·分库分表
知我Deja_Vu1 小时前
【避坑指南】ConcurrentHashMap 并发计数优化实战
java·开发语言·python
wefly20172 小时前
m3u8live.cn 在线M3U8播放器,免安装高效验流排错
前端·后端·python·音视频·前端开发工具
daidaidaiyu2 小时前
Spring IOC 源码学习 事务相关的 BeanDefinition 解析过程 (XML)
java·spring
zhanggongzichu3 小时前
小白怎么理解后端分层概念
后端·全栈
鬼蛟3 小时前
Spring————事务
android·java·spring
西门吹-禅3 小时前
【sap fiori cds up error】
java·服务器·sap cap cds
stark张宇3 小时前
Golang后端面试复盘:从Swoole到IM架构,如何支撑360w用户的实时消息推送?
后端
小码哥_常4 小时前
从0到1:搭建Spring Boot 3企业级认证授权平台
后端
敲代码的嘎仔4 小时前
Java后端面试——SSM框架面试题
java·面试·职场和发展·mybatis·ssm·springboot·八股