1. 事件源(Event Source):可以视为“主题(Subject)”,当其状态发生变化时(比如播放新的内容),会通知所有的观察者。想象我们正在听广播,广播电台就是一个事件源,它提供了大量的新闻、音乐和其他内容。
  2. 事件(Event):这是主题状态改变的具体表示,对应到广播例子中,就是新闻、音乐和其他内容。每当电台播放新的内容时,就相当于一个新的事件被发布了。
  3. 广播器(Event Publisher / Multicaster):广播器起到的是中介的作用,它将事件从事件源传递到监听器。在这个例子中,广播塔就充当了这个角色,它将电台的节目的无线电信号发送到空气中,以便无线电接收器(监听器)可以接收。
  4. 监听器(Listener):监听器就是“观察者”,它们监听并响应特定的事件。在例子中,无线电接收器就是监听器,它接收广播塔发出的信号,然后播放电台的内容。

1 配置自动刷新事件

继承ApplicationEvent,定义刷新事件

public class RefreshEvent extends ApplicationEvent {

	private Object event;

	private String eventDesc;

	public RefreshEvent(Object source, Object event, String eventDesc) {
		super(source);
		this.event = event;
		this.eventDesc = eventDesc;
	}

	public Object getEvent() {
		return this.event;
	}

	public String getEventDesc() {
		return this.eventDesc;
	}

}

2 事件发布者

方式一:直接注入ApplicationContext

@Autowired
private ApplicationContext applicationContext;
applicationContext.publishEvent();

方式二:直接注入ApplicationEventPublisher

@Autowired
private ApplicationEventPublisher applicationEventPublisher;
applicationEventPublisher.publishEvent(myEvent)

方式三:实现ApplicationEventPublisherAware注解

// 事件发布者
@Component
public class CustomEventPublisher implements ApplicationEventPublisherAware {

    private ApplicationEventPublisher applicationEventPublisher;

    @Override
    public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {
        this.applicationEventPublisher = applicationEventPublisher;
    }

    public void publishEvent(RefreshEvent envent) {
        CustomEvent customEvent = new CustomEvent(this, message); // 发布者作为事件来源
        applicationEventPublisher.publishEvent(envent);
    }
}

3 事件监听器

方式一:继承ApplicationListener或者其子类

public class RefreshEventListener implements SmartApplicationListener {

	private ContextRefresher refresh;
	
	/**
	 * 处理刷新事件
	 */
	@Override
	public void onApplicationEvent(ApplicationEvent event) {
		if (event instanceof ApplicationReadyEvent) {
			handle((ApplicationReadyEvent) event);
		}
		else if (event instanceof RefreshEvent) {
			handle((RefreshEvent) event);
		}
	}
	
	/**
	 * 调用ContextRefresher类的刷新方法
	 */
	public void handle(RefreshEvent event) {
		if (this.ready.get()) { // don't handle events before app is ready
			log.debug("Event received " + event.getEventDesc());
			Set<String> keys = this.refresh.refresh();
			log.info("Refresh keys changed: " + keys);
		}
	}
}	

方式二:使用@EventListener注解指定要监听的事件

// 事件监听器
@Component
public class CustomEventListener {

    @EventListener(CustomEvent.class)
    public void handleCustomEvent(CustomEvent event) {
        System.out.println("Received custom event - " + event.getMessage());
    }
}