Spring 国际化支持之 MessageSource

简介: 背景为了友好的支持各个国家的语言,Java 本身已经提供了对国际化的支持,上篇文章《Java 国际化与文本格式化》已经介绍了 Java 对国际化的支持。

背景


为了友好的支持各个国家的语言,Java 本身已经提供了对国际化的支持,上篇文章《Java 国际化与文本格式化》已经介绍了 Java 对国际化的支持。Java 对国际化的支持主要是使用 ResourceBundle 根据区域信息选取不同的 properties 文件获取 key 对应的 value,并且 Java 还提供了 MessageFormat 来支持对消息的格式化,Spring 将这两者进行结合,抽象出了 MessageSource 接口,使我们更方便的在 Spring 中获取国际化消息。


Spring 中的 MessageSource 接口


MessageSource 接口定义


认识 Spring 国际化支持,先从 MessageSource 接口看起,这是 Spring 国际化的核心接口,其定义如下。


public interface MessageSource {
  @Nullable
  String getMessage(String code, @Nullable Object[] args, @Nullable String defaultMessage, Locale locale);
  String getMessage(String code, @Nullable Object[] args, Locale locale) throws NoSuchMessageException;
  String getMessage(MessageSourceResolvable resolvable, Locale locale) throws NoSuchMessageException;
}


MessageSource 接口提供了三个获取国际化消息的方法,其主要是根据 Locale 信息获取对应的国际化消息的集合,然后根据 code 获取对应的消息,并且通过提供的参数 args 还可以对获取后的消息进行格式化。具体参数含义如下。


code:要查找的消息编号。

args:为消息中的参数填充的值。

defaultMessage:默认的消息,如果没有找到将返回默认消息。

resolvable:消息参数,封装了 code、args、defaultMessage。


MessageSource 主要实现


MessageSource 在 Spring 中主要有两个实现,具体如下。


ResourceBundleMessageSource:底层使用 ResourceBundle 和 MessageFormat 实现的 MessageSource。

ReloadableResourceBundleMessageSource:支持国际化文件动态刷新的 MessageSource。

DelegatingMessageSource:代理父 MessageSource 的 MessageSource,获取消息时将委托父 MessageSource 获取,这是 Spring 应用上下文默认创建的 MessageSource。


如何在 Spring 中获取 MessageSource


我们经常说 Spring 的基础容器是 BeanFactory,ApplicationContext 是对 BeanFactory,提供了企业级的特性,其中就包括了对国际化的支持,这是因为 ApplicationContext 接口就继承了 MessageSource 接口,因此就可以认为 ApplicationContext 就是 MessageSource ,在 Spring 应用上下文刷新时将调用 AbstractApplicationContext#initMessageSource 初始化 MessageSource,这将保证 Spring 中一定存在一个类型为 MessageSource 的 bean,ApplicationContext 底层正是依托这个 bean 来实现 MessageSource 接口的方法。因此具有以下的方法获取 MessageSource。


依赖查找 MessageSource,其中 bean 的名称为 messageSource,即AbstractApplicationContext#MESSAGE_SOURCE_BEAN_NAME。

依赖注入 MessageSource。

直接使用 ApplicationContext。

通过 MessageSourceAware 回调获取。


目录
相关文章
|
5月前
|
Java 数据安全/隐私保护 网络架构
一个简单的示例在spring boot中实现国际化
一个简单的示例在spring boot中实现国际化
|
3月前
|
Java Spring 自然语言处理
Spring 框架里竟藏着神秘魔法?国际化与本地化的奇妙之旅等你来揭开谜底!
【8月更文挑战第31天】在软件开发中,国际化(I18N)与本地化(L10N)对于满足不同地区用户需求至关重要。Spring框架提供了强大支持,利用资源文件和`MessageSource`实现多语言文本管理。通过配置日期格式和货币符号,进一步完善本地化功能。合理应用这些特性,可显著提升应用的多地区适应性和用户体验。
40 0
|
6月前
|
存储 Java Spring
Spring之国际化:i18n
【1月更文挑战第17天】 一、i18n概述 二、Java国际化 三、Spring6国际化 1、MessageSource接口 2、使用Spring6国际化
129 1
|
4月前
|
存储 Java UED
Spring Boot中的国际化处理
Spring Boot中的国际化处理
|
5月前
|
自然语言处理 Java UED
Spring Boot中的国际化配置
Spring Boot中的国际化配置
|
6月前
|
缓存 Java Spring
Spring Boot做国际化
Spring Boot做国际化
120 0
|
6月前
|
存储 人工智能 运维
spring国际化 - i18n
spring国际化 - i18n
94 0
|
6月前
|
存储 开发框架 自然语言处理
Spring6 i18n国际化
Spring6 i18n国际化
|
2月前
|
SQL 监控 druid
springboot-druid数据源的配置方式及配置后台监控-自定义和导入stater(推荐-简单方便使用)两种方式配置druid数据源
这篇文章介绍了如何在Spring Boot项目中配置和监控Druid数据源,包括自定义配置和使用Spring Boot Starter两种方法。
|
1月前
|
人工智能 自然语言处理 前端开发
SpringBoot + 通义千问 + 自定义React组件:支持EventStream数据解析的技术实践
【10月更文挑战第7天】在现代Web开发中,集成多种技术栈以实现复杂的功能需求已成为常态。本文将详细介绍如何使用SpringBoot作为后端框架,结合阿里巴巴的通义千问(一个强大的自然语言处理服务),并通过自定义React组件来支持服务器发送事件(SSE, Server-Sent Events)的EventStream数据解析。这一组合不仅能够实现高效的实时通信,还能利用AI技术提升用户体验。
166 2