关注我的公众号:【编程朝花夕拾】,可获取首发内容。

01 引言
上一节介绍了国际化的一个完整案例,但是国际化是到时底层是怎么调用呢?前后端分离的的国家化又当如何使用?
带着这些问题,我们一步步深入了解一下。了解了底层的逻辑,我们才能在使用上随心所欲。
02 前后端分离
上一节使用了后端框架thymeleaf直接获取语言文件的配置信息。前后端分离又当如何传递给前端呢?
2.1 自动装配
这里的关键类是SpringBoot的自动注册类:org.springframework.boot.autoconfigure.context.MessageSourceAutoConfiguration
自动注入MessageSource对象:

我们调用的时候就可以直接调用messageSource.getMessage()即可获取到对应的数据。
当然我们也可以自己定义。
2.2 调用案例

测试结果:

参数主要包括三个:

code:就是文件配置的keyargs:就是配置文件的参数,参数是一个数组,如:user.welcome=Welcome, {0}!locale:区域,决定了哪一个文件配置
03 源码追踪
3.1 自动注册
Spring容器初始化就专门初始化MessageSource:


关键点:
- 约定优于配置 :约定用户把国际化 Bean 命名为
messageSource。 - 父子容器自动串联 :子
ApplicationContext会自动把父容器的MessageSource设为 parent,多容器场景天然支持。 DelegatingMessageSource兜底 :当用户没配置时使用空实现,不会抛异常,但调用getMessage会抛NoSuchMessageException。
3.2 Web调用

大致处理步骤:
- 请求进入
DispatcherServlet。 - 拦截器链执行,
LocaleChangeInterceptor检查 URL 参数lang,若有则用LocaleResolver切换。 - Handler 执行业务逻辑。
- 业务代码通过注入的
MessageSource调用getMessage(code, args, locale)。 - Spring 在当前
ApplicationContext中查找MessageSource,按code -> locale链回退到 parent 容器查找资源。 - 找到原始字符串后用
MessageFormat按args渲染,按locale格式化数字/日期。 - 渲染好的字符串返回给业务层。
04小结
Spring Framework 作为 Java 生态最主流的应用框架,对 I18N 提供了完整、优雅、且高度可扩展的支持。基于 JDK 标准的 java.util.Locale、ResourceBundle 抽象,封装出一套以 MessageSource 为核心的体系,并进一步和 ApplicationContext 容器、事件机制、占位符解析深度集成。
有了框架的支撑,我们就很容易去使用国际化处理多语言的业务。