Spring注解驱动开发学习总结20:Spring容器创建 - 注册bean后置处理器、初始化事件派发器、注册监听器

回顾前2篇文章:
1、Spring注解驱动开发学习总结18:Spring容器创建 - beanFactory创建和预准备工作步骤
分析了Spring容器refresh方法的:
1)刷新前的容器准备:prepareRefresh();
2)刷新内置的bean工厂:obtainFreshBeanFactory();
3)bean工厂的预处理工作:prepareBeanFactory(beanFactory);
4)bean工厂创建并预备好以后的后置处理工作:postProcessBeanFactory(beanFactory);

2、Spring注解驱动开发学习总结19:Spring容器创建 - beanFactory后置处理器的操作步骤
分析了Spring容器refresh方法的:
5)执行beanFactory的后置处理器工作:
invokeBeanFactoryPostProcessors(beanFactory)

1、查看Spring容器的refresh方法

本文接着继续分析refresh方法
6、在528行,注册bean后置处理器:registerBeanPostProcessors(beanFactory)
7、在531行,初始化MessageSource组件(国际化功能、消息绑定):initMessageSource();
8、在534行,初始化事件派发器:initApplicationEventMulticaster();
9、在537行,容器刷新方法:onRefresh();
10、在540行,注册监听器:registerListeners();
在这里插入图片描述

分析registerBeanPostProcessors方法

6、注册bean后置处理器:registerBeanPostProcessors(beanFactory)
  6.1 在188行,首先获取所有BeanPostProcessor类型的组件
  6.2 在198-216行,后置处理器实现不同接口,就放入不同的容器中
    实现了PriorityOrdered接口,放入priorityOrderedPostProcessors中;
    实现了MergedBeanDefinitionPostProcessor接口,放入internalPostProcessors中;
    实现了Ordered接口,放入orderedPostProcessorNames中;
    剩下的,放入nonOrderedPostProcessorNames中。
  6.3 在220,232,243,247行,再按顺序注册各自容器中的后置处理器:
    registerBeanPostProcessors调用beanFactory.addBeanPostProcessor(postProcessor);
    调用容器顺序:priorityOrderedPostProcessors,orderedPostProcessorNames,
    nonOrderedPostProcessorNames,最后是internalPostProcessors
  6.4 在251行,最终注册一个ApplicationListenerDetector:在bean创建完成后,检查是否是
    ApplicationListener
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

分析initMessageSource方法

7、初始化MessageSource组件(国际化功能、消息绑定):initMessageSource();
  7.1 在711行,获取beanFactory
  7.2 在712-713,729-731行,判断beanFactory中是否有id为messageSource,类型为
    MessageSource的组件
    如果有,将该组件赋值给messageSource;
    如果没有,新建一个DelegatingMessageSource,然后赋值给messageSource
  7.3 在732行,将创建好的DelegatingMessageSource注册到容器中,id还是为
    messageSource。
    这样以后要获取国际化配置文件的值的时候,可以在业务逻辑中自动注
    入messageSource组件。可以看到DelegatingMessageSource类中的54,64,74行中都有
    getMessage方法,以后在业务逻辑中可以通过该方法获取对应值。
在这里插入图片描述
在这里插入图片描述

分析initApplicationEventMulticaster方法

8、初始化事件派发器:initApplicationEventMulticaster();
  8.1 在746行,获取beanFactory
  8.2 在747-749,755-756行,判断beanFactory是否有id为applicationEventMulticaster,类型为 
    ApplicationEventMulticaster的组件。
    如果有,则直接赋值给applicationEventMulticaster;
    如果没有,新建一个SimpleApplicationEventMulticaster赋值给applicationEventMulticaster
    并将新创建的组件添加到beanFactory中,以后其他组件可以自动注入
在这里插入图片描述

分析onRefresh方法

9、容器刷新方法:onRefresh();
  9.1 在800行,可以看到Spring默认什么都不做,这个方法留给子类来重新这个方法,给一些特
    殊bean,在它们实例化之前,预留的做初始化操作的机会
    Called on initialization of special beans, before instantiation of singletons.
在这里插入图片描述

分析registerListeners方法

10、注册监听器:registerListeners();
  10.1 分析809-811,815-818行,先获取所有的ApplicationListener类的组件,然后将每个监听器
    添加到事件派发器中:
    getApplicationEventMulticaster().addApplicationListenerBean(listenerBeanName);
  10.2 获取之前不中中产生的事件,如果有的话,就先进行事件派发
在这里插入图片描述

2、 小结

前面2篇文章分析了refresh方法1-5的步骤,本文分析了refresh方法中的第6-10步
1、在512行,刷新前的容器准备:prepareRefresh()
2、在515行,刷新内置的bean工厂:obtainFreshBeanFactory()
3、在518行,bean工厂的预处理工作:prepareBeanFactory(beanFactory);
4、在522行,bean工厂创建并预备好以后的后置处理工作:postProcessBeanFactory(beanFactory);
5、在525行,执行beanFactory的后置处理器工作:

6、在528行,注册bean后置处理器:registerBeanPostProcessors(beanFactory)
  6.1 在188行,首先获取所有BeanPostProcessor类型的组件
  6.2 在198-216行,后置处理器实现不同接口,就放入不同的容器中
    实现了PriorityOrdered接口,放入priorityOrderedPostProcessors中;
    实现了MergedBeanDefinitionPostProcessor接口,放入internalPostProcessors中;
    实现了Ordered接口,放入orderedPostProcessorNames中;
    剩下的,放入nonOrderedPostProcessorNames中。
  6.3 在220,232,243,247行,再按顺序注册各自容器中的后置处理器:
    registerBeanPostProcessors调用beanFactory.addBeanPostProcessor(postProcessor);
    调用容器顺序:priorityOrderedPostProcessors,orderedPostProcessorNames,
    nonOrderedPostProcessorNames,最后是internalPostProcessors
  6.4 在251行,最终注册一个ApplicationListenerDetector:在bean创建完成后,检查是否是
    ApplicationListener
7、在531行,初始化MessageSource组件(国际化功能、消息绑定):initMessageSource();
  7.1 在711行,获取beanFactory
  7.2 在712-713,729-731行,判断beanFactory中是否有id为messageSource,类型为
    MessageSource的组件
    如果有,将该组件赋值给messageSource;
    如果没有,新建一个DelegatingMessageSource,然后赋值给messageSource
  7.3 在732行,将创建好的DelegatingMessageSource注册到容器中,id还是为
    messageSource。
    这样以后要获取国际化配置文件的值的时候,可以在业务逻辑中自动注
    入messageSource组件。可以看到DelegatingMessageSource类中的54,64,74行中都有
    getMessage方法,以后在业务逻辑中可以通过该方法获取对应值。
8、在534行,初始化事件派发器:initApplicationEventMulticaster();
  8.1 在746行,获取beanFactory
  8.2 在747-749,755-756行,判断beanFactory是否有id为applicationEventMulticaster,类型为 
    ApplicationEventMulticaster的组件。
    如果有,则直接赋值给applicationEventMulticaster;
    如果没有,新建一个SimpleApplicationEventMulticaster赋值给applicationEventMulticaster
    并将新创建的组件添加到beanFactory中,以后其他组件可以自动注入
9、在537行,容器刷新方法:onRefresh();
  9.1 在800行,可以看到Spring默认什么都不做,这个方法留给子类来重新这个方法,给一些特
    殊bean,在它们实例化之前,预留的做初始化操作的机会
    Called on initialization of special beans, before instantiation of singletons.
10、在540行,注册监听器:registerListeners();
  10.1 分析809-811,815-818行,先获取所有的ApplicationListener类的组件,然后将每个监听器
    添加到事件派发器中:
    getApplicationEventMulticaster().addApplicationListenerBean(listenerBeanName);
  10.2 获取之前不中中产生的事件,如果有的话,就先进行事件派发

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值