spring源码学习笔记-初始化(五)-MessageSource事件监听
器
refresh()⽅法中在上篇看完了对PostProcessors的处理,这篇继续往下看。
注:refresh()的代码就不再次列举了,请看spring源码中AbstractApplicationContext类。
⼀、initMessageSource(),这个⽅法是对spring的MessageSource初始化,代码如下:
[java]
1. ConfigurableListableBeanFactory beanFactory = getBeanFactory();
2. if (ainsLocalBean(MESSAGE_SOURCE_BEAN_NAME)) {
3. //第1部分
先看
4. }
5. el {
6. //第2部分
7. }
ConfigurableListableBeanFactory beanFactory = getBeanFactory();
if (ainsLocalBean(MESSAGE_SOURCE_BEAN_NAME)) {
//第1部分
}
el {
//第2部分
}
⾸先获取beanFactory对象,然后判断是否定义了名为messageSource的localbean,如果有则执⾏第1部分,否则执⾏第2部分,分别来看两部分代码
注:localbean实际上就是指查找的时候不会去parent查找这个bean,只从当前beanfactory去查找,很多地⽅有这个就不⼀⼀注明了第1部分:
[java]
1. ssageSource = Bean(MESSAGE_SOURCE_BEAN_NAME, MessageSource.class);
2. if (this.parent != null && ssageSource instanceof HierarchicalMessageSource) {
3. HierarchicalMessageSource hms = (HierarchicalMessageSource) ssageSource;
4. if (ParentMessageSource() == null) {
5. hms.tParentMessageSource(getInternalParentMessageSource());
6. }
7. }
8. if (logger.isDebugEnabled()) {
9. logger.debug("Using MessageSource [" + ssageSource + "]");
10. }
if (this.parent != null && ssageSource instanceof HierarchicalMessageSource) {
生活大爆炸5HierarchicalMessageSource hms = (HierarchicalMessageSource) ssageSource;
if (ParentMessageSource() == null) {
hms.tParentMessageSource(getInternalParentMessageSource());
}
}
if (logger.isDebugEnabled()) {
logger.debug("Using MessageSource [" + ssageSource + "]");
}
第1⾏获取名为messageSource的bean赋值给当前ApplicationContext对象的messageSource属性
第2⾏判断如果当前ApplicationContext的parent不为null;并且messageSource对象继承了HierarchicalMessageSource接⼝则进⾏如下处理:
进⾏判断如果messageSource的parentMessageSource为空,则设置为getInternalParentMessageSource()⽅法的返回值。
getInternalParentMessageSource()⽅法的代码也很简单
(getParent() instanceof AbstractApplicationContext) ? ((AbstractApplicationContext) getParent()).messageSource : getParent()
lengthy如果当前ApplicationContext的parent对象是AbstractApplicationContext或其⼦类类型则返回它的messageSource,否则直接返回其parent对象
最后是打印⼀⾏debug级别⽇志表⽰当前应⽤的messageSource
第2部分:
雅虎日语在线翻译
[java]
1. DelegatingMessageSource dms = new DelegatingMessageSource();
2. dms.tParentMessageSource(getInternalParentMessageSource());
3. ssageSource = dms;
4. isterSingleton(MESSAGE_SOURCE_BEAN_NAME, ssageSource);
5. if (logger.isDebugEnabled()) {
6. logger.debug("Unable to locate MessageSource with name '" + MESSAGE_SOURCE_BEAN_NAME +
7. "': using default [" + ssageSource + "]");
摩登家庭第五季8. }
DelegatingMessageSource dms = new DelegatingMessageSource();
dms.tParentMessageSource(getInternalParentMessageSource());
if (logger.isDebugEnabled()) {
logger.debug("Unable to locate MessageSource with name '" + MESSAGE_SOURCE_BEAN_NAME +
"': using default [" + ssageSource + "]");
}
第1⾏创建⼀个DelegatingMessageSource对象dms
第2⾏类似上⾯,设置dms的parentMessageSource为getInternalParentMessageSource()返回值
第3⾏设置当前ApplicationContext的messageSource属性为dms
第4⾏把这个对象注册⼀个名为messageSource的单例bean
打印⼀⾏debut⽇志表⽰⽆⽤户定义messageSource,使⽤默认
⼆、紧接着处理完messageSource的初始化后下⼀⾏代码:initApplicationEventMulticaster(),主要是对spring的事件监听器的管理器的初始话,代码如下:
[java]
1. ConfigurableListableBeanFactory beanFactory = getBeanFactory();
2. if (ainsLocalBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME)) {
3. this.applicationEventMulticaster =
4. Bean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, ApplicationEventMulticaster.class);
5. if (logger.isDebugEnabled()) {
6. logger.debug("Using ApplicationEventMulticaster [" + this.applicationEventMulticaster + "]");
7. }
8. }
9. el {
10. this.applicationEventMulticaster = new SimpleApplicationEventMulticaster(beanFactory);
11. isterSingleton(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, this.applicationEventMulticaster);
12. if (logger.isDebugEnabled()) {
13. logger.debug("Unable to locate ApplicationEventMulticaster with name '" +
14. APPLICATION_EVENT_MULTICASTER_BEAN_NAME +
dmoz15. "': using default [" + this.applicationEventMulticaster + "]");
色度16. }
17. }
ConfigurableListableBeanFactory beanFactory = getBeanFactory();
if (ainsLocalBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME)) {
this.applicationEventMulticaster =
简爱在线阅读Bean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, ApplicationEventMulticaster.class);
if (logger.isDebugEnabled()) {
logger.debug("Using ApplicationEventMulticaster [" + this.applicationEventMulticaster + "]");
}
}
el {
this.applicationEventMulticaster = new SimpleApplicationEventMulticaster(beanFactory);
if (logger.isDebugEnabled()) {
logger.debug("Unable to locate ApplicationEventMulticaster with name '" +
APPLICATION_EVENT_MULTICASTER_BEAN_NAME +
"': using default [" + this.applicationEventMulticaster + "]");
}
}
和messageSource的处理类似,⾸先取得beanFactory对象,
判断如果⽤户主动定义了applicationEventMulticaster的bean,则把这个bean设置给applicationEventMulticaster属性
如果没有则初始话⼀个默认的SimpleApplicationEventMulticaster,注册bean并赋值给对应属性
不同情况分别打印不同的⽇志,源代码中的⽇志打印最好也稍微注意⼀下有个印象,这样在看spring的⽇志时会更清晰
三、接下来是⼀个模板⽅法onRefresh(),第⼀篇中提到过这个是在处理messageSource、applicationEventMulticaster等特殊bean 后,普通单例bean没初始话之前,为ApplicationContext⼦类提供扩展去处理⼀些类似的特殊bean。
举个例⼦AbstractRefreshableWebApplicationContext、GenericWebApplicationContext、StaticWebApplicationContext中都有⼀个themeSource,这个就要放在这个⽅法⾥去初始化。这个themeSource是spring的主题功能,可以实现根据不同主题加载不同资源⽂件等功能。
四、上⾯处理了事件监听器的管理器初始化,现在开始做时间监听器的注册:registerListeners(),这个⽅法的代码如下:
[java]
1. for (ApplicationListener listener : getApplicationListeners()) {
2. getApplicationEventMulticaster().addApplicationListener(listener);
3. }
4.
5. String[] listenerBeanNames = getBeanNamesForType(ApplicationListener.class, true, fal);
6. for (String lisName : listenerBeanNames) {
7. getApplicationEventMulticaster().addApplicationListenerBean(lisName);
8. }
for (ApplicationListener listener : getApplicationListeners()) {
getApplicationEventMulticaster().addApplicationListener(listener);
}
String[] listenerBeanNames = getBeanNamesForType(ApplicationListener.class, true, fal);
for (String lisName : listenerBeanNames) {
getApplicationEventMulticaster().addApplicationListenerBean(lisName);
}
齐桓公读音是什么上⾯3⾏是处理当前ApplicationContext中的静态特殊监听器集合,循环调⽤applicationEventMulticaster的
addApplicationListener()⽅法注册到applicationEventMulticaster中
后⾯的⼀部分⾸先取出所有类型为ApplicationListener的bean的name集合,然后循环调⽤applicationEventMulticaster的
addApplicationListenerBean()⽅法注册到applicationEventMulticaster中romaine
注意上⾯两个注册⽅法的不同,分别会注册到applicationEventMulticaster.defaultRetriever的不同集合中
本篇分别看到了messageSource、applicationEventMulticaster和applicationListener以及中间提到的主题themeSource的初始化,这⾥主要介绍初始话,所以后续再对spring的这⼏个功能模块做分别详细的分析。