Google Code Prettify

2017年7月23日 星期日

Spring Application Event

spring framework 的 bean 一般熟知的就是 IoC 的依賴注入 (dependency injection),這裡介紹一個較少用到的功能,bean 與 bean 之前傳遞事件! 既然是談到事件,最好就先了解一下 Observer Pattern,spring framework 實作了這個 pattern,讓程式中有兩個 bean,當 bean A 狀態有變化時,可以通知 bean B,說明如下:
  • Event
 1 @Data
 2 public class MyBeanEvent extends ApplicationEvent {
 3     private String msg;
 4 
 5     public MyBeanEvent(Object source) {
 6         super(source);
 7         
 8         this.msg = (String) source;
 9     }
10 }
首先定義一個事件類別,這個類別需繼承 ApplicationEvent 類別,我們自己定義的事件類別需有建構子 (constructor),即程式中 5 ~ 9 行,我們將傳遞過來的物件存入變數 msg 裡。
  • Publisher
1 @Component
2 public class MyPublisher {
3     @Inject
4     private ApplicationContext context;
5     
6     public void publish(String msg) {
7         context.publishEvent(new MyBeanEvent(msg));
8     }
9 }
發佈訊息的類別如上,使用 spring 的 ApplicationContext 的 publishEvent method 即可發佈出訊息物件,所有的傾聽者 bean 就會收到訊息物件。
  • Listener
1 @Component
2 public class MyListener implements ApplicationListener<MyBeanEvent> {
3 
4     @Override
5     public void onApplicationEvent(MyBeanEvent event) {
6         System.out.println("listen: " + event.getMsg());
7     }
8 }
傾聽類別要實作 ApplicationListener 介面,並指出要傾聽的事件類別,如上面的第 2 行,這個介面會要求傾聽類別實作一個 onApplicationEvent method,當 publisher 發出事件時,這個 method 即會收到該事件,這裡很簡單的將收到的事件內容印出來 (line 6)。
  • Config
1 @Configuration
2 @ComponentScan("idv.steven.info.tse")
3 public class MyEventConfig {
4 
5 }
要測試 publisher 送出的訊息是否會被 listener 收到,當然要先讓 spring 將它們載入,因為 publisher 和 listener 兩個 bean 是被在 idv.steven.info.tse package 下,所以第 2 行就去掃描該 package。
  • Main
1 public class MyTestMain {
2 
3     public static void main(String[] args) {
4         AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MyEventConfig.class);
5         MyPublisher publisher = context.getBean(MyPublisher.class);
6         publisher.publish("Hello World");
7         context.close();
8     }
9 }
主程式很簡單,使用 spring 的 AnnotatioinConfigApplicationContext 載入 MyEventConfig,MyEventConfig 會去掃描指定的 package 將標有 @Component 相關的 bean 載入,載入後就如第 5 行,主程式取得 publisher 物件,然後在第 6 行發佈出 "Hello World" 的訊息,執行的結果就可以看到 console 印出如下訊息:
listen: Hello World



沒有留言:

張貼留言