上一篇:12-Spring源码解析之refresh(5)——registerBeanPostProcessors
上一篇我们分析完了registerBeanPostProcessors
,接下来,我们开始分析refresh
中的第七个方法initMessageSource
和第八个方法initApplicationEventMulticaster
一、initMessageSource
初始化MessageSource
组件(做消息绑定、消息解析)
protected void initMessageSource() {
ConfigurableListableBeanFactory beanFactory = getBeanFactory();
// 判断是否已经存在名为messageSource的Bean了
if (beanFactory.containsLocalBean(MESSAGE_SOURCE_BEAN_NAME)) {
this.messageSource = beanFactory.getBean(MESSAGE_SOURCE_BEAN_NAME, MessageSource.class);
// Make MessageSource aware of parent MessageSource.
if (this.parent != null && this.messageSource instanceof HierarchicalMessageSource) {
HierarchicalMessageSource hms = (HierarchicalMessageSource) this.messageSource;
if (hms.getParentMessageSource() == null) {
// Only set parent context as parent MessageSource if no parent MessageSource
// registered already.
hms.setParentMessageSource(getInternalParentMessageSource());
}
}
if (logger.isTraceEnabled()) {
logger.trace("Using MessageSource [" + this.messageSource + "]");
}
}
else {
// Use empty MessageSource to be able to accept getMessage calls.
DelegatingMessageSource dms = new DelegatingMessageSource();
// 获取父容器的messageSource字段
// 一般都为空
dms.setParentMessageSource(getInternalParentMessageSource());
this.messageSource = dms;
// ----------该方法的核心---------------
// 把MessageSource注入到容器中,以后获取国际化配置文件值的时候,可以自动注入MessageSource
beanFactory.registerSingleton(MESSAGE_SOURCE_BEAN_NAME, this.messageSource);
if (logger.isTraceEnabled()) {
logger.trace("No '" + MESSAGE_SOURCE_BEAN_NAME + "' bean, using [" + this.messageSource + "]");
}
}
}
// 取出国际化配置文件中的某个key值(可以按住区域信息获取)
protected MessageSource getInternalParentMessageSource() {
return (getParent() instanceof AbstractApplicationContext ?
((AbstractApplicationContext) getParent()).messageSource : getParent());
}
1.1 registerSingleton
public void registerSingleton(String beanName, Object singletonObject) throws IllegalStateException {
super.registerSingleton(beanName, singletonObject);
updateManualSingletonNames(set -> set.add(beanName), set -> !this.beanDefinitionMap.containsKey(beanName));
clearByTypeCache();
}
首先要调用父类的registerSingleton
public void registerSingleton(String beanName, Object singletonObject) throws IllegalStateException {
Assert.notNull(beanName, "Bean name must not be null");
Assert.notNull(singletonObject, "Singleton object must not be null");
synchronized (this.singletonObjects) {
Object oldObject = this.singletonObjects.get(beanName);
if (oldObject != null) {
throw new IllegalStateException("Could not register object [" + singletonObject +
"] under bean name '" + beanName + "': there is already object [" + oldObject + "] bound");
}
addSingleton(beanName, singletonObject);
}
}
将beanName
和singletonObject
添加到singletonObjects
和registeredSingletons
中,并将其从singletonFactories
和earlySingletonObjects
中移除。这里面涉及了用于存储Bean
的4种不同的Map
。这里需要简单的解释一下。这些在创建Bean
的时候会经常用到,用于解决循环依赖,缓存等问题。
singletonObjects
:用于保存beanName
和bean
实例之间的关系singletonFactories
:用于保存beanName
和创建bean
工厂之间的关系earlySingletonObjects
:用于保存beanName
和bean
实例之间的关系,与singletonObjects
不同之处在于:当一个单利bean
被放到这里面之后,那么当bean
还在创建过程种,就可以通过getBean
方法获取到了,目的是用来检查循环依赖。registeredSingletons
:用于保存当前所有已经创建的bean
。
protected void addSingleton(String beanName, Object singletonObject) {
synchronized (this.singletonObjects) {
this.singletonObjects.put(beanName, singletonObject);
this.singletonFactories.remove(beanName);
this.earlySingletonObjects.remove(beanName);
this.registeredSingletons.add(beanName);
}
}
在initMessageSource
执行完后,我们看一下beanFactory
的registeredSingletons
的属性的值
-
registeredSingletons[0]
–registeredSingletons[2]
- 在
refresh
->prepareBeanFactory
方法中注册
- 在
-
registeredSingletons[3]
–registeredSingletons[6]
- 在
refresh
->invokeBeanFactoryPostProcessors
方法中注册
- 在
-
registeredSingletons[7]
–registeredSingletons[10]
- 在
refresh
->registerBeanPostProcessors
方法中注册
- 在
-
registeredSingletons[11]
- 在
refresh
->initMessageSource
方法中注册
- 在
二、initApplicationEventMulticaster
事件派发器
protected void initApplicationEventMulticaster() {
ConfigurableListableBeanFactory beanFactory = getBeanFactory();
if (beanFactory.containsLocalBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME)) {
this.applicationEventMulticaster =
beanFactory.getBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, ApplicationEventMulticaster.class);
if (logger.isTraceEnabled()) {
logger.trace("Using ApplicationEventMulticaster [" + this.applicationEventMulticaster + "]");
}
}
else {
this.applicationEventMulticaster = new SimpleApplicationEventMulticaster(beanFactory);
beanFactory.registerSingleton(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, this.applicationEventMulticaster);
if (logger.isTraceEnabled()) {
logger.trace("No '" + APPLICATION_EVENT_MULTICASTER_BEAN_NAME + "' bean, using " +
"[" + this.applicationEventMulticaster.getClass().getSimpleName() + "]");
}
}
}
跟initMessageSource
方法类似,这里不详细介绍了。看一下执行完该方法后beanFactory
的registeredSingletons
的属性的值
beanFactory
的registeredSingletons
的属性中多了applicationEventMulticaster
。
下一篇文章我们讲解refresh
的第九个方法onRefresh
和第十个方法registerListeners
。