来到了方法initMessageSource()
在上一讲中,我们已经搞清楚了如下registerBeanPostProcessors方法所做的事情,它无非就是来注册BeanPostProcessor的。
然后,我们让程序运行到以上第531行代码(即initMessageSource方法)处。顾名思义,该方法是来初始化MessageSource组件的。对于Spring MVC而言,该方法主要是来做国际化功能的,如消息绑定、消息解析等。
接下来,我们就得来研究研究initMessageSource方法里面究竟做了些什么事了。
获取BeanFactory
按下F5快捷键进入到initMessageSource方法里面,如下图所示,可以看到一开始是先来获取BeanFactory的。
而这个BeanFactory,我们之前早就准备好了。
看容器中是否有id为messageSource,类型是MessageSource的组件
按下F6快捷键让程序继续往下运行,会发现有一个判断,即判断BeanFactory中是否有一个id为messageSource的组件。我为什么会这么说呢,你只要看一下常量MESSAGE_SOURCE_BEAN_NAME的值就知道了,如下图所示,该常量的值就是messageSource。
若有,则赋值给this.messageSource
如果有的话,那么会从BeanFactory中获取到id为messageSource,类型是MessageSource的组件,并将其赋值给this.messageSource。这可以从下面这行代码看出。
很显然,容器刚开始创建的时候,肯定是还没有的,所以程序会来到下面的else语句中。
若没有,则创建一个DelegatingMessageSource类型的组件,并把创建好的组件注册在容器中
如果没有的话,那么Spring自己会创建一个DelegatingMessageSource类型的对象,即MessageSource类型的组件。
那么问题来了,这种MessageSource类型的组件有啥作用呢?我们不妨查看一下MessageSource接口的源码,如下图所示,它里面定义了很多重载的getMessage方法,该方法可以从配置文件(特别是国际化配置文件)中取出某一个key所对应的值。
也就是说,这种MessageSource类型的组件的作用一般是取出国际化配置文件中某个key所对应的值,而且还能按照区域信息获取哟~
建好的MessageSource类型的组件注册到容器中
紧接着,把创建好的MessageSource类型的组件注册到容器中,所执行的是下面这行代码。
那么,我们以后想获取国际化配置文件中的值的时候,就可以直接自动注入这个MessageSource类型的组件了,然后调用它的getMessage方法就行了,并且还能按照区域信息获取哟😁