简单写一下spring中事件的实现.
框架启动时,会把被listen注解的方法收集起来.当发布者publisher把事件发布委托给ApplicationEventPublisher,这个bean其实在spring中已经提前创建好了.
其实提前创建的这个bean,是AbstractApplicationContext子类,这个类中实现了publishEvent方法,而该方法由委托给了上下文中存在的ApplicationEventMulticaster进行处理.
未完待续,后面会重新仔细分析spring中事件处理的实现.
spring中的事件
对spring中事件包进行一个全面的解读.

ApplicationEvent
事件对象,spring中的事件对象继承了jdk中的事件对象.继承之后只是添加了一个时间戳字段(long型),还派生出一个接口ApplicationContextEvent,该接口也是什么都没有做.
还预定了4种事件.从上图可以看出来.具体不在细说.
ApplicationListener
//todo
该接口使用ApplicationEvent对象作为操作对象.这个接口有2个子接口.这2个子接口定义是一样的.为啥会有2个子接口,这个后面需要研究一下.
2个子接口只是增加了对所监听的事件类型的一些判断功能,比如某个监听器监听一类事件,但对这一类事件的某一种不支持.那么可以通过子接口来进行一些操作.
子接口的实现类ApplicationListenerMethodAdapter,这个类是适配类.适配什么呢?从之前对spring中例子的用法可以看出,@EventListener注解是注解在方法上的.所以适配的是,把对事件的处理,委托给这个适配器处理. 当然,这个适配器本身自己也是一个监听器.
GenericApplicationListenerAdapter这个实现类,也是适配类,通过内省声明的监听器对象来决定自己感兴趣的事件的类型.当然,这个类自身也是一个监听器.
SourceFilteringListener是一个装饰类,把监视器装饰一下,这个类可以对事件进行一些过滤处理.
可以看到,这几个类都继承了Ordered接口,显然,对一个事件的监听处理,是可以通过@Order权重进行优先级排序的.
EventListenerFactory 是工厂接口,策略模式.负责对被@EventListener注解修饰的方法产生监听器对象.前面提到的ApplicationListenerMethodAdapter,这个适配类,就是通过工厂所接收到的方法,产生对应的方法的监听器对象.
ApplicationEventMulticaster
多播,同一个事件,可能会有多个监听器对其感兴趣,这个接口负责广播这个事件.其实这个接口定义的就是对这一组监听器的crud.SimpleApplicationEventMulticaster是其最终实现类.spring启动后,使用的就是这个多播器.
在上下文refresh的时候,会调用initApplicationEventMulticaster,这个方法把SimpleApplicationEventMulticaster放到上下文中.
以上,有事件源,有事件,有监听者,都齐全了.还需要一个把@EventListener注解修饰的方法转换成listener的中介.这个中介是EventListenerMethodProcessor.他实现了一些接口,在bean生命周期的某些时机,会把bean的被修饰的方法拿出来,生成一个listener,然后放到集合中去,下次事件源发布事件的时候,就可以处理事件了.从这点可以看出来,被@EventListener修饰的方法所在的类,必须是个bean.
EventPublicationInterceptor拦截器会把事件发布到ApplicationEventPublisher内注册的所有的Listener.