springboot的4種監聽器方式

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章