Spring ApplicationContext事件處理機制


ApplicationContext中事件處理是由ApplicationEvent類和ApplicationListener接口來提供的。如果一個Bean實現了ApplicationListener接口,並且已經發布到容器中去,每次ApplicationContext發布一個ApplicationEvent事件,這個Bean就會接到通知。Spring事件機制是觀察者模式的實現。
ApplicationContext中的事件處理是通過ApplicationEvent類和ApplicationListener接口來提供的,
通過ApplicationContext的publishEvent()方法發布到ApplicationListener;
在這里包含三個角色:被發布的事件,事件的監聽者和事件發布者。
事件發布者在發布事件的時候通知事件的監聽者。
spring的事件需要遵循以下流程:
(1)自定義事件:繼承ApplicationEvent   當前類的作用
(2)定義事件監聽器:實現ApplicationListener
(3)使用容器發布事件

 

代碼實現

1,容器事件

package com.example.demo.springEvent;

import org.springframework.context.ApplicationEvent;

/**
 * @Description //TODO 容器事件
 * @Author GaoX
 * @Date 2020/6/29 16:33
 */
public class MessageEvent extends ApplicationEvent {

    private String text;

    public String getText() {
        return text;
    }

    public void setText(String text) {
        this.text = text;
    }

    public MessageEvent(Object source) {
        super(source);
    }

    public MessageEvent(Object source, String text) {
        super(source);
        this.text = text;
    }

    public void print(){
        System.out.println("監聽器調用此方法!!!!!!!!!!!!");
    }

}

2,監聽器

package com.example.demo.springEvent;

import org.springframework.context.ApplicationEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;

/**
 * @Description //TODO 監聽器
 * @Author GaoX
 * @Date 2020/6/29 16:36
 */
@Component
public class MessageListener implements ApplicationListener {

    @Override
    public void onApplicationEvent(ApplicationEvent event) {
        //此處可以定義多個ApplicationEvent
        if(event instanceof MessageEvent){
            MessageEvent messageEvent = (MessageEvent)event;
            messageEvent.print();
            System.out.println(messageEvent.getSource());
            System.out.println(messageEvent.getText());
        }
    }
}

3,事件發布

package com.example.demo.springEvent;

import org.springframework.context.ApplicationContext;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @Description //TODO 事件發布
 * @Author GaoX
 * @Date 2020/6/29 16:41
 */
@RestController
public class MessagePublishEvent {

    private ApplicationContext applicationContext;

    public MessagePublishEvent(ApplicationContext applicationContext) {
        this.applicationContext = applicationContext;
    }

    @GetMapping("/publishEvent")
    public void publishEvent(String s){
        MessageEvent messageEvent = new MessageEvent("測試發送", "test="+s);
        applicationContext.publishEvent(messageEvent);
    }

}

控制台打印

 

 


 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM