Spring源码解析5-注册BeanPostProcesser与消息资源和监听器的初始化与注册

2022-10-01 12:09:24

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() 将给定的事件广播到对应的监听器上,然后执行相关事件监听触发的逻辑

  • 作者:locket
  • 原文链接:https://blog.csdn.net/weixin_43582204/article/details/123970428
    更新时间:2022-10-01 12:09:24