13-Spring源码解析之refresh(6)——【initMessageSource】和【initApplicationEventMulticaster】

上一篇: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);
		}
	}

beanNamesingletonObject添加到singletonObjectsregisteredSingletons中,并将其从singletonFactoriesearlySingletonObjects中移除。这里面涉及了用于存储Bean的4种不同的Map。这里需要简单的解释一下。这些在创建Bean的时候会经常用到,用于解决循环依赖,缓存等问题。

  • singletonObjects:用于保存beanNamebean实例之间的关系
  • singletonFactories:用于保存beanName和创建bean工厂之间的关系
  • earlySingletonObjects:用于保存beanNamebean实例之间的关系,与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执行完后,我们看一下beanFactoryregisteredSingletons的属性的值

在这里插入图片描述

  • 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方法类似,这里不详细介绍了。看一下执行完该方法后beanFactoryregisteredSingletons的属性的值

在这里插入图片描述
beanFactoryregisteredSingletons的属性中多了applicationEventMulticaster

下一篇文章我们讲解refresh的第九个方法onRefresh和第十个方法registerListeners

发布了397 篇原创文章 · 获赞 71 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/xiaojie_570/article/details/104702604
今日推荐