Spring ApplicationEvent事件机制

Spring ApplicationEvent事件机制源码分析

观察者模式

  1. 通用类图
    观察者模式通用类图

  2. 简单实现

public interface Observer {
    void update(Object message);
}

public class ConcreteObserver implements Observer{
    @Override
    public void update(Object message) {
        System.out.println("receive msg: " + JSON.toJSONString(message));
    }
}

public abstract class Observale {
    private List<Observer> observers = new ArrayList<>();

    public void addObserver(Observer observer) {
        this.observers.add(observer);
    }

    public void notifyObservers(Object message) {
        for (Observer observer : this.observers) {
            observer.update(message);
        }
    }
}

public class ConcreteObservale extends Observale {
    public void doSomething() {
        super.notifyObservers("ConcreteObservale doSomething");
    }
}

public class ObTest {
    public static void main(String[] args) {
        ConcreteObserver concreteObserver = new ConcreteObserver();
        ConcreteObservale concreteObservale = new ConcreteObservale();

        concreteObservale.addObserver(concreteObserver);

        concreteObservale.doSomething();
    }
}

ApplicationEvent分析

  1. 对spring applicationEvent 提炼为对应的观察者模式实现
public class ApplicationEvent {
    private Object object ;

    public Object getObject() {
        return object;
    }

    public void setObject(Object object) {
        this.object = object;
    }
}

public interface ApplicationListener {
    void onApplicationEvent(ApplicationEvent applicationEvent);
}

public class Listener implements ApplicationListener{
    @Override
    public void onApplicationEvent(ApplicationEvent applicationEvent) {
        System.out.println("receive msg: " + JSON.toJSONString(applicationEvent));
    }
}

public class SimpleApplicationEventMulticaster {


    private List<ApplicationListener> applicationListeners = new ArrayList<>();

    public void addApplicationListener(ApplicationListener applicationListener) {
        this.applicationListeners.add(applicationListener);
    }

    public void multicastEvent(ApplicationEvent applicationEvent) {
        for (ApplicationListener applicationListener : this.applicationListeners) {
            this.doInvokeListener(applicationListener, applicationEvent);
        }
    }

    private void doInvokeListener(ApplicationListener applicationListener, ApplicationEvent applicationEvent) {
        applicationListener.onApplicationEvent(applicationEvent);
    }

}

public class ApplicationTest {
    public static void main(String[] args) {
        ApplicationListener listener = new Listener();
        SimpleApplicationEventMulticaster simpleApplicationEventMulticaster = new SimpleApplicationEventMulticaster();
        simpleApplicationEventMulticaster.addApplicationListener(listener);

        ApplicationEvent applicationEvent = new ApplicationEvent();
        applicationEvent.setObject("send msg");
        simpleApplicationEventMulticaster.multicastEvent(applicationEvent);
    }
}

SimpleApplicationEventMulticaster 是观察者模式中的Observale角色,具有管理Obsever(addApplicationListener(ApplicationListener applicationListener))、通知Obsever(multicastEvent(ApplicationEvent applicationEvent))功能;
ApplicationListener 对应Obsever;
ApplicationEvent 为消息体。

  1. 源码分析
    在这里插入图片描述
public class ApplicationTest {
    public static void main(String[] args) {
    	//1 实例化Observer
        ApplicationListener listener = new Listener();
        //2 实例化Observable
        SimpleApplicationEventMulticaster simpleApplicationEventMulticaster = new SimpleApplicationEventMulticaster();
        //3 Observable 中 绑定 Observer
        simpleApplicationEventMulticaster.addApplicationListener(listener);

		//4 消息体
        ApplicationEvent applicationEvent = new ApplicationEvent();
        applicationEvent.setObject("send msg");
        //5 通知 Observer
        simpleApplicationEventMulticaster.multicastEvent(applicationEvent);
    }
}

此为1中对应的测试代码,下面把spring中所做的步骤和这个测试代码一一对应。

initApplicationEventMulticaster(); 实例化多播器并放入singletonObjects中,相当于2步骤(实例化Observable)使其具有管理和通知Observer功能。
在这里插入图片描述
registerListeners();相当于1步骤和3步骤,Observable 注入被管理对象。
在这里插入图片描述
调用过程publishEvent(new ContextRefreshedEvent(this)); 对应5步骤
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值