关于spring boot 的运行原理
1. 首先要有一个事件 这个事件是要继承 ApplicationEvent 这个类的.
2.然后就是监听事件,这个类要实现ApplicationListener
3.然后就是把事件加入到ApplicationContext 里面 也就是
1.(还可以通过可以在自定义类上的监听器 加上@Component注解)这一种是把监听器放入spring容器里面管理
2.(还有可以通过在properties 文件里面配置 context.linstener.classes=”监听器的全类名“)
3.(还可以通过@EventListener 注解在方法上,这个方法的param的类型必须是ApplicationEvent的子类)这一种我觉得是最方便的。
当然这个还是有其他方法4.然后就是发布这个事件。通过ApplicationContext的pulishEvent方法
这样一个简单的事件监听就完了。
(1)我们简单的来看下context.linstener.classes 这种的实现原理,这种的是实现就要看DelegatingApplicationListener
这个类了。
DelegatingApplicationListener 这个类实现了ApplicationListener<ApplicationEvent> 这个类,然后ApplicationListener<ApplicationEvent> 继承这个类。
我们是主要看DelegatingApplicationListener 这个类里面的onApplicationEvent这个方法就可以的。
这里首先会判断是不是ApplicationEnvironmentPreparedEvent这个类型,如果是这个类型才开始里面的逻辑getListeners() 方法 就是获得所有这个类型事件的监听器。
如果这个类型的监听器为空,那么就直接返回。
然后创建一个简单的广播事件SimpleApplicationEventMulticaster对象把所有的监听器加到里面。
最后就是进行广播事件。
ApplicationEnvironmentPreparedEvent 这个类是继承了SpringApplicationEvent然后 SpringApplicationEvent又继承了ApplicationEvent这个类。
(2)下面我们来看看@EventListener 注解这种实现的原理
这个我们就要参考EventListenerMethodProcessor这个类的afterSingletonsInstantiated()方法里面的processBean() 方法,
这个方法里面我们主要看这一断逻辑
在这里它是把所有的ApplicationListener加入到ApplicationListener
网友评论