• spring5.0 源码解析(day06) initApplicationEventMulticaster();


    Spring 事件

    主要就是三个部分: 事件、事件发布者、事件监听器。

    • 事件:ApplicationEvent,要自定义事件,则需要创建一个类继承 ApplicationEvent。
    • 事件发布者:ApplicationEventPublisher 和 ApplicationEventMulticaster,因为 ApplicationContext 实现了 ApplicationEventPublisher,所以事件发布可以直接使用 ApplicationContext。
    • 事件监听器:ApplicationListener,通过创建一个实现了 ApplicationListener 并注册为 Spring bean 的类来接收消息。

    创建事件发布者

    @Component
    // Aware 注入 applicationEventPublisher
    public class MyPublisher implements ApplicationEventPublisherAware {
    
    	private ApplicationEventPublisher applicationEventPublisher;
    
    	@Override
    	public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {
    		this.applicationEventPublisher = applicationEventPublisher;
    	}
    
    	public void doPublisher(String msg){
    		applicationEventPublisher.publishEvent(new MyApplicationEvent(msg));
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    创建事件

    public class MyApplicationEvent extends ApplicationEvent {
    	public MyApplicationEvent(Object source) {
    		super(source);
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    创建事件监听器

    public class MyListener implements ApplicationListener<MyApplicationEvent> {
    	// 监听MyApplicationEvent事件
    	@Override
    	public void onApplicationEvent(MyApplicationEvent event) {
    		String source = (String)event.getSource();
    		System.out.printf("监听者收到了消息" + source);
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    运行

    这样用 Publisher 发布消息 , 监听者就可以接收到消息了

    	MyPublisher myPublisher = (MyPublisher)applicationContext.getBean("myPublisher");
    	myPublisher.doPublisher("今天晚上吃啥");
    
    • 1
    • 2

    initApplicationEventMulticaster 流程

    initApplicationEventMulticaster 这个方法用于初始化事件广播器 代码 和 initMessageSource 大致相同,都是 先查找是否有用户自定义的 Multicaster 若没有初始化一个默认的。 至于是如何发布消息的 等我看完之后的代码再来补上吧

    protected void initApplicationEventMulticaster() {
    		// 获取工厂
    		ConfigurableListableBeanFactory beanFactory = getBeanFactory();
    		//首先判断是否已有xml文件定义了id为aplicationEventMulticaster的bean对象
    		//自定义的事件监听多路广播器需要实现AplicationEventMulticaster接口
    		if (beanFactory.containsLocalBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME)) {
    			// 保存多播事件
    			this.applicationEventMulticaster =
    					beanFactory.getBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, ApplicationEventMulticaster.class);
    			if (logger.isTraceEnabled()) {
    				logger.trace("Using ApplicationEventMulticaster [" + this.applicationEventMulticaster + "]");
    			}
    		}
    		else {
    			// 不存在 创建SimpleApplicationEventMulticaster
    
    			//因为SimpleApplicationEventMulticaster继承了AbstractApplicationEventMulticaster抽象类,而这个抽象类实现了aplicationEventMulticaster接口
    			//因此SimpleApplicationEventMulticaster是aplicationEventMulticaster接口的一个实现
    
    			this.applicationEventMulticaster = new SimpleApplicationEventMulticaster(beanFactory);
    			// 注册 bean
    			beanFactory.registerSingleton(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, this.applicationEventMulticaster);
    			if (logger.isTraceEnabled()) {
    				logger.trace("No '" + APPLICATION_EVENT_MULTICASTER_BEAN_NAME + "' bean, using " +
    						"[" + this.applicationEventMulticaster.getClass().getSimpleName() + "]");
    			}
    		}
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

  • 相关阅读:
    UE4贴图自适应屏幕大小
    网站绑定证书的情况下是否可以避免流量劫持呢?
    算法----递增的三元子序列
    Python实战:获取bing必应壁纸首页的每日一图(仅做学习用)
    GEO生信数据挖掘(一)数据集下载和初步观察
    深入理解互联网的原理——服务器、客户端和http协议
    oracle从入门到精通第三篇(条件取值语句|约束|子查询|自查询|连表查询)
    Primavera P6 Calendars 全局日历和项目日历Calendar
    Linux安装Nexus(图文解说详细版)
    腾讯原来这么容易进去...
  • 原文地址:https://blog.csdn.net/qq_44808472/article/details/126193246