1. 这里的事件是什么意思:实际上就是一个指定类型的对象实例。
2. 事件监听器能做什么:只要发布了事件,就会触发监听器的执行。
定义事件:
public class MyEvent extends ApplicationEvent {
// 第一个参数是不可缺少的,后面的参数可以是任意多个(或零个,自定义)
public MyEvent(Object source, String info) {
super(source);
//内容是自定义的
System.out.println("事件已经发生了:" + info);
}
}
定义监听器,有4种方法,第一种(纯java方式):
public class MyListener implements ApplicationListener<MyEvent> {
//一旦springboot 发布了MyEvent事件,就会触发执行此方法,方法内容自定义
@Override
public void onApplicationEvent(MyEvent myEvent) {
System.out.println("触发执行了监听器");
}
}
@SpringBootApplication
public class Application {
public static void main(String[] args){
SpringApplication springApplication = new SpringApplication(Application.class);
springApplication.addListeners(new MyListener());
ConfigurableApplicationContext context = springApplication.run(args);
//发布事件
context.publishEvent(new MyEvent(new Object(), "hello"));
}
}
第二种(注解方式):
@Component
public class MyListener2 implements ApplicationListener<MyEvent> {
@Override
public void onApplicationEvent(MyEvent myEvent) {
System.out.println("触发执行了监听器");
}
}
@SpringBootApplication
public class Application {
public static void main(String[] args){
SpringApplication springApplication = new SpringApplication(Application.class);
//用Component注入了监听器后,就不用再addListener了
ConfigurableApplicationContext context = springApplication.run(args);
context.publishEvent(new MyEvent(new Object(), "hello"));
}
}
第三种(配置文件形式),在application.yml中配置:
context:
listener:
classes: com.dangh.test.listener.MyListener
@SpringBootApplication
public class Application {
public static void main(String[] args){
SpringApplication springApplication = new SpringApplication(Application.class);
//在配置文件中配置了监听器,就不用再addListener了
ConfigurableApplicationContext context = springApplication.run(args);
context.publishEvent(new MyEvent(new Object(), "hello"));
}
}
第四种(@EventListener注解,不用实现ApplicationListener接口了):
@Component
public class MyListener3 {
@EventListener
public void listenerMethod(MyEvent myEvent){
System.out.println("监听器执行了");
}
}
@SpringBootApplication
public class Application {
public static void main(String[] args){
SpringApplication springApplication = new SpringApplication(Application.class);
//在配置文件中配置了监听器,就不用再addListener了
ConfigurableApplicationContext context = springApplication.run(args);
context.publishEvent(new MyEvent(new Object(), "hello"));
}
}
个人觉得第二种和第四种方式要好一些,因为简单明了,代码可读性好,对于第二种,一看实现了ApplicationListener接口就知道是个监听器,对于第四种,一看@EventListener注解就知道是个监听器。