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 容器、事件机制、占位符解析深度集成。

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

相关推荐
AI绘画哇哒哒9 分钟前
【建议收藏!】35岁后端血泪忠告,这3类人别硬转Agent(过来人亲述)
java·人工智能·后端·ai·程序员·大模型·agent
最强小杰1 小时前
gpt-5.6-sol 频繁报 503 怎么办?区分容量熔断和限速 429 的排查方法 + 可复用 retry wrapper
java·人工智能·gpt·ai
唐青枫1 小时前
一个值多种形态:Zig union、Tagged Union 与内存布局实战
后端
卷无止境1 小时前
Windows 上丝滑开发 Python,并稳定构建 Docker 镜像
后端·python·docker
Nturmoils2 小时前
备份完不算完,先还原到临时库验一遍
后端
Csvn2 小时前
📊 SQL 入门 Day 22:视图与物化视图
后端·sql
Csvn2 小时前
🐍 Day 4: Python 控制流 — 条件、循环与推导式的艺术
后端·python
吠品3 小时前
Wine 在 Linux 上运行 Windows 软件完整指南
java·linux·服务器
2601_953720823 小时前
【计算机毕业设计】基于Vue与Spring Boot的高校兼职信息服务平台设计与实现
spring boot·后端·课程设计
亚历克斯神4 小时前
智能搜索系统的升级复盘——从 Elasticsearch 到混合检索的检索质量提升
java·spring·微服务