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 获取之前不中中产生的事件,如果有的话,就先进行事件派发