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);
    }

}

控制台打印

 

 


 

posted @ 2020-06-29 16:58  高木子  阅读(834)  评论(0编辑  收藏  举报