Spring I18N 底层源码大揭秘:你的 MessageSource 到底是怎么找到配置的?

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

01 引言

上一节介绍了国际化的一个完整案例,但是国际化是到时底层是怎么调用呢?前后端分离的的国家化又当如何使用?

带着这些问题,我们一步步深入了解一下。了解了底层的逻辑,我们才能在使用上随心所欲。

02 前后端分离

上一节使用了后端框架thymeleaf直接获取语言文件的配置信息。前后端分离又当如何传递给前端呢?

2.1 自动装配

这里的关键类是SpringBoot的自动注册类:org.springframework.boot.autoconfigure.context.MessageSourceAutoConfiguration

自动注入MessageSource对象:

我们调用的时候就可以直接调用messageSource.getMessage()即可获取到对应的数据。

当然我们也可以自己定义。

2.2 调用案例

测试结果:

参数主要包括三个:

  • code:就是文件配置的key
  • args:就是配置文件的参数,参数是一个数组,如: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 容器查找资源。
  • 找到原始字符串后用 MessageFormatargs 渲染,按 locale 格式化数字/日期。
  • 渲染好的字符串返回给业务层。

04小结

Spring Framework 作为 Java 生态最主流的应用框架,对 I18N 提供了完整、优雅、且高度可扩展的支持。基于 JDK 标准的 java.util.LocaleResourceBundle 抽象,封装出一套以 MessageSource 为核心的体系,并进一步和 ApplicationContext 容器、事件机制、占位符解析深度集成。

有了框架的支撑,我们就很容易去使用国际化处理多语言的业务。

相关推荐
Yyyyyy~12 小时前
【java】数组的定义和使用
java
麻辣布丁12 小时前
java集合篇面试模拟
java·开发语言·面试
niucloud-admin12 小时前
JAVA V6 多商户商城 开发文档——插件开发规范
java·开发语言
嘟哩DuliDuli12 小时前
创作 Agent 的任务状态该如何保存
android·java·javascript
wdfk_prog13 小时前
lely-canopen-rtt:为什么推荐在 RT-Thread 上使用 Lely CANopen 构建主站
java·运维·缓存·docker·容器
海盗123413 小时前
DSH 接入 OpenCode Go 报 400 MissingSessionID:从 LLM 语义层退到 fetch 传输层的完整排障
开发语言·后端·golang
Token掘金室13 小时前
JSON模式结构化输出报错
java·服务器·json
秋饼13 小时前
Spring AI 2.0 接入 DeepSeek V4.1 Flash 生产级实战
java·ai·技术分享·后端开发
IT枫斗者枫哥13 小时前
Java 分批导出仍然 OOM?用 32 MiB 堆复现三种 CSV 写法
java
一木 之林13 小时前
第 3 节 在 AI 行业中,C/C++ 编程中的动态库和静态库
c语言·c++·后端