八、Spring源码学习之initMessageSource方法

在Spring框架中,initMessageSource 方法通常用于初始化应用程序的消息源(Message Source),它是负责解析和获取本地化消息(通常是国际化字符串)的组件。消息源是Spring国际化支持的核心部分,允许开发人员根据用户的语言环境提供不同的消息内容。

initMessageSource 方法通常会在Spring容器的初始化阶段被调用,用来配置和设置消息源。具体的实现和调用方式可能因Spring版本和应用程序的上下文配置而有所不同,但通常涉及以下步骤:

  • 创建消息源对象:根据配置,创建一个消息源对象。这通常是一个实现了 org.springframework.context.MessageSource 接口的类,比如 ResourceBundleMessageSource。
  • 设置基名:为消息源设置基名(basename),这通常是包含消息属性的资源文件的基础名称。Spring会根据这个基名和当前的语言环境来查找具体的资源文件。
  • 设置缓存:配置消息源的缓存策略,以优化性能。通常,消息源会缓存已经加载的消息,以避免重复从资源文件中读取。
  • 设置默认编码:设置默认的字符编码,用于处理从资源文件中读取的字符串。
  • 其他配置:根据具体需求,可能还需要进行其他配置,比如设置父消息源(用于消息源的继承)或自定义消息格式等。
  • 注册到容器中:将配置好的消息源注册到Spring容器中,这样其他组件就可以通过依赖注入或查找容器的方式来使用它。

在Spring Boot中,initMessageSource 方法通常会被自动配置所覆盖,开发人员只需要在 application.properties 或 application.yml 文件中配置相关的国际化属性,Spring Boot就会自动创建一个合适的消息源并注册到容器中。

protected void initMessageSource() {
		//获取beanFactory
		ConfigurableListableBeanFactory beanFactory = getBeanFactory();
		//判断容器中是否存在messageSource(xml中是否定义了messageSource)
		if (beanFactory.containsLocalBean(MESSAGE_SOURCE_BEAN_NAME)) {
			//存在 则获取
			this.messageSource = beanFactory.getBean(MESSAGE_SOURCE_BEAN_NAME, MessageSource.class);
			// Make MessageSource aware of parent MessageSource.
			//如果当前容器存在父容器 并且messageSource的类型是HierarchicalMessageSource,则转成成 HierarchicalMessageSource
			if (this.parent != null && this.messageSource instanceof HierarchicalMessageSource) {
				HierarchicalMessageSource hms = (HierarchicalMessageSource) this.messageSource;
				//同时判断hms 是否有父级MessageSource 如果没有则设置父级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.
			//如果容器中没有messageSource,则创建一个新的,并且设置父级messageSource
			DelegatingMessageSource dms = new DelegatingMessageSource();
			dms.setParentMessageSource(getInternalParentMessageSource());
			this.messageSource = dms;
			//并且向容器中注册该messageSource
			beanFactory.registerSingleton(MESSAGE_SOURCE_BEAN_NAME, this.messageSource);
			if (logger.isTraceEnabled()) {
				logger.trace("No '" + MESSAGE_SOURCE_BEAN_NAME + "' bean, using [" + this.messageSource + "]");
			}
		}
	}
`refresh()` 是 Spring 框架中的一个方法,它用于刷新应用程序上下文(ApplicationContext)以更新其内部状态。在 Spring 框架中,`refresh()` 方法是非常重要的,因为它负责完成应用程序上下文的初始化和配置,并准备好所有的单例 bean 以供使用。 下面是 `refresh()` 方法的主要流程: 1. 准备刷新过程中需要用到的变量和标志位; 2. 调用 `prepareRefresh()` 方法,进行一些预处理工作; 3. 调用 `obtainFreshBeanFactory()` 方法,创建 BeanFactory 并进行一些初始化工作; 4. 调用 `prepareBeanFactory(beanFactory)` 方法,对 BeanFactory 进行一些后续处理; 5. 调用 `postProcessBeanFactory(beanFactory)` 方法,对 BeanFactory 进行后置处理; 6. 调用 `invokeBeanFactoryPostProcessors(beanFactory)` 方法,执行 BeanFactoryPostProcessor 的 postProcessBeanFactory() 方法; 7. 调用 `registerBeanPostProcessors(beanFactory)` 方法,注册 BeanPostProcessor 实例; 8. 调用 `initMessageSource()` 方法,初始化 MessageSource 组件; 9. 调用 `initApplicationEventMulticaster()` 方法,初始化 ApplicationEventMulticaster 组件; 10. 调用 `onRefresh()` 方法,进行一些自定义的刷新工作; 11. 调用 `registerListeners()` 方法,注册事件监听器; 12. 调用 `finishBeanFactoryInitialization(beanFactory)` 方法,完成所有非延迟初始化的单例 bean 的初始化工作; 13. 调用 `finishRefresh()` 方法,完成上下文的刷新工作。 需要注意的是,`refresh()` 方法在执行过程中会涉及到很多细节,比如如何处理环境变量、如何处理自定义的 bean 定义、如何处理多个上下文之间的关系等等。如果需要深入了解 `refresh()` 方法的实现细节,可以查看 Spring 框架的源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值