今天学习了一下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("测试事件"));
}
}
测试验证:
直接启动我们的工程,就可以看到结果。
由此我们可以看到,消息的监听是有顺序的。
原文转自:
https://blog.csdn.net/ignorewho/article/details/80702827