本文包含以下内容:
registerBeanPostProcessors(); 注册BeanPostProcessor
initMessageSource初始化MessageSource国际化组件
initApplicationEventMulticaster();初始化事件派发器
onRefresh();留给子容器(子类)
registerListeners();给容器中将所有项目里面的ApplicationListener注册进来;
1.registerBeanPostProcessors(); 注册BeanPostProcessor
先给出总结如下:
不同接口类型的BeanPostProcessor;在Bean创建前后的执行时机是不一样的,可以看到BeanPostProcessor 的实现类如下
BeanPostProcessor、
DestructionAwareBeanPostProcessor、
InstantiationAwareBeanPostProcessor、
SmartInstantiationAwareBeanPostProcessor、
MergedBeanDefinitionPostProcessor【internalPostProcessors】、
1)、获取所有的 BeanPostProcessor;后置处理器都默认可以通过PriorityOrdered、Ordered接口来执行优先级
2)、先注册PriorityOrdered优先级接口的BeanPostProcessor;
把每一个BeanPostProcessor;添加到BeanFactory中
beanFactory.addBeanPostProcessor(postProcessor);
3)、再注册Ordered接口的
4)、最后注册没有实现任何优先级接口的
5)、最终注册MergedBeanDefinitionPostProcessor;
6)、注册一个ApplicationListenerDetector;来在Bean创建完成后检查是否是ApplicationListener,如果是
applicationContext.addApplicationListener((ApplicationListener<?>) bean);
结合代码来看
/**
1.获取所有 BeanPostProcessor
String[] postProcessorNames =
2.按照优先级接口进行分组
// Register BeanPostProcessorChecker that logs an info message when
循环,进行优先级分组
for (String ppName : postProcessorNames) {
进行排序、注册到容器
// First, register the BeanPostProcessors that implement PriorityOrdered.
3.进行order 接口的排序、注册
// Next, register the BeanPostProcessors that implement Ordered.
4.进行没有优先级的接口的BeanPostProcessor注册
// Now, register all regular BeanPostProcessors.
5. 注册MergedBeanDefinitionPostProcessor
// Finally, re-register all internal BeanPostProcessors.
6.注册一个 ApplicationListenerDetector
// Re-register post-processor for detecting inner beans as ApplicationListeners,
用于判断注册的Bean是不是 ApplicationListener 如果是将注册进监听器列表中
if (this.applicationContext != null && bean instanceof ApplicationListener) {
2.initMessageSource初始化MessageSource国际化组件
MessageSource,主要用于 国际化。先给出结论如下:
1)、获取BeanFactory
2)、看容器中是否有id为messageSource的,类型是MessageSource的组件
如果有赋值给messageSource,如果没有自己创建一个DelegatingMessageSource;
MessageSource:取出国际化配置文件中的某个key的值;能按照区域信息获取;
3)、把创建好的MessageSource注册在容器中,以后获取国际化配置文件的值的时候,可以自动注入MessageSource;
beanFactory.registerSingleton(MESSAGE_SOURCE_BEAN_NAME, this.messageSource);
结合代码如下:
1.获取BeanFactory ,并判断是否存在 messageSource 的Bean
ConfigurableListableBeanFactory beanFactory = getBeanFactory();
2.如果存在则,赋值给messageSource
if (beanFactory.containsLocalBean(MESSAGE_SOURCE_BEAN_NAME)) {
3.如果不存在则创建 DelegatingMessageSource
else {
3.initApplicationEventMulticaster();初始化事件派发器
给出结论如下:
1)、获取BeanFactory2)、从BeanFactory中获取applicationEventMulticaster的ApplicationEventMulticaster;3)、如果上一步没有配置;创建一个SimpleApplicationEventMulticaster4)、将创建的ApplicationEventMulticaster添加到BeanFactory中,以后其他组件直接自动注入
结合代码如下
1.获取BeanFactory
2.获取applicationEventMulticaster 的Bean
/**
3.获取成功则设置到局部变量中
4.获取失败则进行创建 SimpleApplicationEventMulticaster,并注入到容器中
if (beanFactory.containsLocalBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME)) {
4.onRefresh();留给子容器(子类)
普通的预留接口,给 子类实现
/**
5.registerListeners();给容器中将所有项目里面的ApplicationListener注册进来;
先给出结论如下:
1、从容器中拿到所有的ApplicationListener2、将每个监听器添加到事件派发器中; getApplicationEventMulticaster().addApplicationListenerBean(listenerBeanName);3、派发之前步骤产生的事件;
具体代码如下:
1.拿到所有的监听器,并添加到多播器中
// Register statically specified listeners first.
2.从容器中获取到具体监听器的Bean ,并添加进入多播器中
String[] listenerBeanNames = getBeanNamesForType(ApplicationListener.class, true, false);
3.派发之前步骤的事件
// Publish early application events now that we finally have a multicaster...
-END-
可以关注我的公众号,免费获取价值1980元****学习资料
点击“在看”,学多少都不会忘~
本文分享自微信公众号 - 阿聪的全栈之路(gh_ffab7c84fb0c)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。