refresh()的registerBeanPostProcessors()
实例化并且注册所有的beanPostProcessor处理器,这里只是注册功能,真正调用的是getBean方法
registerBeanPostProcessors()
registerBeanPostProcessors()
找到所有实现了BeanPostProcessor接口的类,按实现了PriorityOrdered接口,实现了Ordered接口,spring内部与普通的BeanPostProcessor分类存放,然后进行排序、注册。
最后注册ApplicationListenerDetector到beanFactory中,此类用来检测bean是否实现了ApplicationListener接口,两个作用:
1、实例化完成之后,如果bean是单例并且属于ApplicationListener接口,则加入到多播器中
2、bean销毁之前,如果bean是一个applicationListener,则从多播器中提前删除
refresh()的initMessageSource() 为上下文初始化message源,即不同语言的消息体,国际化处理
refresh()中的initApplicationEventMulticaster()与registerListeners(),用的是观察者模式
ApplicationEvent 事件
ApplicationListener 监听器
initApplicationEventMulticaster() 初始化事件监听多路广播器,创建多播器对象
判断容器中是否有自定义事件监听多路广播器,没有就采用默认的SimpleApplicationEventMulticaster
new SimpleApplicationEventMulticaster(),多播器对象应该包含一个监听器集合,自身没有就找父类
AbstractApplicationEventMulticaster的addApplicationListener()方法,找到监听器集合applicationListeners
registerListeners() 在所有注册的bean中查找listener bean,注册到消息广播器中
1、getApplicationEventMulticaster()获取多播器对象,addApplicationListener() 遍历应用程序中存在的监听器集合,并将对应的监听器添加到监听器的多路广播器中
2、从容器中获取所有实现了ApplicationListener接口的bd的bdName, addApplicationListenerBean()放入ApplicationListenerBeans集合中
3、先发布早期的监听器集合,getApplicationEventMulticaster().multicastEvent() 将给定的事件广播到对应的监听器上,然后执行相关事件监听触发的逻辑