Spring系列16:ApplicationContext扩展国际化

简单点对比下两者的功能定位:

  • BeanFactory 提供了管理和操作 bean 的基本功能,为 Spring的IoC 功能提供了底层基础,用于与 Spring 的其他部分以及相关的第三方框架的集成
  • ApplicationContext 在 BeanFactory 基础上还扩展了其他接口以提供更多面向应用程序框架和企业开发的附加功能。

下表列出了 BeanFactory 和 ApplicationContext 接口和实现提供的功能。

功能特性

Bean实例化和属性注入 Yes Yes 生命周期管理 No Yes

自动注册 No Yes

自动注册 No Yes 国际化

No Yes 内置的

发布机制 No Yes

因为ApplicationContext包含BeanFactory的所有功能,所以通常建议使用它而不是普通的BeanFactory,除非需要完全控制bean处理的场景。

上面讨论了 org.springframework.beans.factory包提供了管理和操作bean的基本功能,包括以编程的方式。 org.springframework.context包添加了ApplicationContext接口,它扩展了BeanFactory接口,此外还扩展了其他接口,以更面向应用程序框架的方式提供额外的功能。

  • 国际化: 通过 MessageSource 接口以 i18n 方式访问消息
  • 通过 ResourceLoader 接口访问资源,例如 URL 和文件
  • 事件发布,即通过使用 ApplicationEventPublisher 接口发布到实现 ApplicationListener 接口的 bean
  • 通过 HierarchicalBeanFactory 接口加载多个(分层)上下文,让每个上下文都专注于一个特定的层,例如应用程序的 Web 层

ApplicationContext 接口扩展了一个名为 MessageSource 的接口,因此提供了国际化(”i18n”)功能。

MessageSource 接口定义和主要方法如下

public interface MessageSource {
    // 获取消息: code消息key args替换内支持{} default默认值 loc语言
    String getMessage(String code, Object[] args, String default, Locale loc);
    String getMessage(String code, Object[] args, Locale loc)
    String getMessage(String code, Object[] args, Locale loc)
}

java.util.Locale 对象表示特定的地理、政治或文化区域。如中国是 zh

  • 加载 ApplicationContext 时,它会自动搜索上下文中定义的 MessageSource bean。 bean 必须具有名称 messageSource
  • 如果找到了这样的bean,那么对上述方法的所有调用都被委托给消息源。
  • 如果没有找到消息源,ApplicationContext将尝试查找包含具有相同名称的bean的父类。如果有,则使用该bean作为MessageSource。
  • 如果 ApplicationContext 找不到任何消息源,则实例化一个空的 DelegatingMessageSource 以便能够接受对上面定义的方法的调用。

Spring 提供了三个 MessageSource 实现:

  • ResourceBundleMessageSource 使用指定的基本名称访问资源包,这个类依赖于底层 JDK 的 ResourceBundle 实现,结合 MessageFormat 提供的 JDK 标准消息解析。
  • ReloadableResourceBundleMessageSource Spring 特定的实现,使用指定的基本名称访问资源包,参与 Spring .ApplicationContext 的资源加载。与基于 JDK 的 ResourceBundleMessageSource 相比,该类使用 java.util.Properties实例作为其自定义的消息数据结构,通过 Spring Resource 句柄的 org.springframework.util.PropertiesPersister 策略加载它们。 该策略不仅能够基于时间戳更改重新加载文件,还能够加载具有特定字符编码的属性文件。它还将检测 XML 属性文件。
  • StaticMessageSource。 MessageSource 的简单实现,它允许以编程方式注册消息。此 MessageSource 支持基本的国际化。用于测试而不是用于生产系统。

它们都实现了 HierarchicalMessageSource 以进行嵌套消息传递。

Resource 相关的知识点后续文章已经安排上

提供一个ResourceBundleMessageSource 的案例,方便理解。

Original: https://www.cnblogs.com/kongbubihai/p/16011336.html
Author: kongxubihai
Title: Spring系列16:ApplicationContext扩展国际化

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/572038/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球