欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Spring5源码 - 10 Spring事件监听机制_应用篇

程序员文章站 2022-07-12 11:23:54
...

Spring5源码 - 10 Spring事件监听机制_应用篇


Spring事件概览

Spring事件体系包括三个组件:事件,事件监听器,事件广播器

事件

Spring5源码 - 10 Spring事件监听机制_应用篇

Spring的内置事件中由系统内部进行发布,只需注入监听器

  • ContextRefreshedEvent

当容器被实例化或refreshed时发布.如调用refresh()方法, 此处的实例化是指所有的bean都已被加载,后置处理器都被**,所有单例bean都已被实例化, 所有的容器对象都已准备好可使用. 如果容器支持热重载,则refresh可以被触发多次(XmlWebApplicatonContext支持热刷新,而 GenericApplicationContext则不支持)

  • ContextStartedEvent

当容器启动时发布,即调用start()方法, 已启用意味着所有的Lifecycle bean都已显式接收到了start 信号

  • ContextStoppedEvent

当容器停止时发布,即调用stop()方法, 即所有的Lifecycle bean都已显式接收到了stop信号 , 关闭的容器可以通过start()方法重启

  • ContextClosedEvent

当容器关闭时发布,即调用close方法, 关闭意味着所有的单例bean都已被销毁.关闭的容器不能被重启或refresh


Spring5源码 - 10 Spring事件监听机制_应用篇

23岁的程序猿大爷都说了,让整个小demo , 那来吧

Spring5源码 - 10 Spring事件监听机制_应用篇

先贴个配置类

package com.artisan.eventlistener2;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;


@Configuration
@ComponentScan("com.artisan.eventlistener2")
public class ArtisanConfig {

 
}

自定义事件

事件类需要继承ApplicationEvent

package com.artisan.eventlistener2;

import org.springframework.context.ApplicationEvent;


public class ArtisanEvent  extends ApplicationEvent {

	private String msg ;

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


	public ArtisanEvent(Object source,String msg) {
		super(source);
		this.msg = msg ;
	}

	public void print(){
		System.out.println(msg);
	}

}
    

作为测试,使用一个简单的pojo

  1. 自定义事件需要继承ApplicationEvent
  2. 因为ApplicationEvent extends EventObject ,所以子类的构造方法需要调用super()

事件监听器

下面演示两种方式

基于接口

package com.artisan.eventlistener2;

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


@Component
public class ArtisanListener implements ApplicationListener<ArtisanEvent> {

	@Override
	public void onApplicationEvent(ArtisanEvent event) {
		System.out.println("实现ApplicationListener  监听到ArtisanEvent.....");
		event.print();
	}
}
  1. 事件监听器需要实现ApplicationListener接口,泛型接口,泛型类类型就是事件类型
  2. 其次需要是spring容器托管的bean,所以这里加了@component,重写onApplicationEvent方法

基于注解

package com.artisan.eventlistener2;

import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;


@Component
public class ArtisanListenerByAnno   {


	@EventListener(ArtisanEvent.class)
	public void onApplicationEvent(ArtisanEvent event) {
		System.out.println("EventListener  监听到ArtisanEvent.....");
		event.print();
	}
}
    
  1. 方法上需要标注 @EventListener(ArtisanEvent.class),方法名任意
  2. 其次需要是spring容器托管的bean,所以这里加了@component

@EventListener,修饰在方法上,是不是比基于实现类的方式要好,不用一个事件一个类了,确实如此。


事件广播器

package com.artisan.eventlistener2;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;


public class ArtisanTest {

	public static void main(String[] args) {
		AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(ArtisanConfig.class);
		ac.publishEvent(new ArtisanEvent("xxxx","msg from artisanEvent"));
	}
}

核心就是ac.publishEvent

ac.publishEvent(new ArtisanEvent("xxxx","msg from artisanEvent"));

【测试结果】

Spring5源码 - 10 Spring事件监听机制_应用篇

是不是发现,这不就是【观察者模式】吗? ----------确实确实,这就是观察者模式的典型应用,那spring是怎么实现的呢?

下篇我们继续分析Spring的源码实现