今天学习了一下SpringBoot的事件发布机制,在此记录下。

SpringBoot进行事件监听有四种方式:
1.手工向ApplicationContext中添加监听器
2.将监听器装载入spring容器
3.在application.properties中配置监听器
4.通过@EventListener注解实现事件监听

讲到事件监听,这里我们说下自定义事件和自定义监听器类的实现方式:
自定义事件:继承自ApplicationEvent抽象类,然后定义自己的构造器
自定义监听:实现ApplicationListener接口,然后实现onApplicationEvent方法。

首先创建消息事件:

import org.springframework.context.ApplicationEvent;

public class MyEvent extends ApplicationEvent {

    public MyEvent(Object source) {
        super(source);
    }
}

这里创建了一个最简单的消息事件,默认使用source传递消息。

下面讲下4种事件监听的具体实现。

方式1. 创建消息监听器类实现ApplicationListener。

import org.springframework.context.ApplicationListener;

public class MyEventListener1 implements ApplicationListener<MyEvent> {
    @Override
    public void onApplicationEvent(MyEvent myEvent) {
        Object msg = myEvent.getSource();
        System.out.println("自定义事件监听器(MyEventListener1)收到发布的消息: " + msg);
    }
}

然后在启动类中去加载我们的事件监听器:

import com.xqnode.learning.common.event.MyEvent;
import com.xqnode.learning.common.event.MyEventListener1;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;

@SpringBootApplication
public class LearningApplication {
    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(LearningApplication.class, args);
        context.addApplicationListener(new MyEventListener1());
    }
}

方式2. 将事件监听器装载到spring的bean中:

@Component
public class MyEventListener2 implements ApplicationListener<MyEvent> {
    @Override
    public void onApplicationEvent(MyEvent myEvent) {
        Object msg = myEvent.getSource();
        System.out.println("自定义事件监听器(MyEventListener2)收到发布的消息: " + msg);
    }
}

方式3. 通过配置文件指定事件监听器的位置。先创建监听器:

public class MyEventListener3 implements ApplicationListener<MyEvent> {
    @Override
    public void onApplicationEvent(MyEvent myEvent) {
        Object msg = myEvent.getSource();
        System.out.println("自定义事件监听器(MyEventListener3)收到发布的消息: " + msg);
    }
}

然后在application.yml中指定其位置:

context:
  listener:
    classes: com.xqnode.learning.common.event.MyEventListener3

你可能会发现yml会报警告,找不到context.listener.classes这个配置项,其实这个配置是存在的,直接忽略它的警告就好。

方式4. 通过 @EventListener来配置事件监听器:

import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;

@Component
public class MyEventListener4 {
    @EventListener
    public void listener(MyEvent myEvent) {
        Object msg = myEvent.getSource();
        System.out.println("自定义事件监听器(MyEventListener4)收到发布的消息: " + msg);
    }
}

好了,至此我们完成了4中消息监听器的配置,下面还差最后一步,需要在启动类中发布消息:

import com.xqnode.learning.common.event.MyEvent;
import com.xqnode.learning.common.event.MyEventListener1;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;

@SpringBootApplication
public class LearningApplication {
    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(LearningApplication.class, args);
        context.addApplicationListener(new MyEventListener1());
        context.publishEvent(new MyEvent("测试事件"));
    }
}

测试验证:
直接启动我们的工程,就可以看到结果。
event
由此我们可以看到,消息的监听是有顺序的。


原文转自:
https://blog.csdn.net/ignorewho/article/details/80702827

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐