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註解就知道是個監聽器。