Spring系列16:ApplicationContext扩展国际化
本文内容
BeanFactory对比ApplicationContext
ApplicationContext的扩展能力
国际化
BeanFactory对比ApplicationContext
简单点对比下两者的功能定位:
- BeanFactory 提供了管理和操作 bean 的基本功能,为 Spring的IoC 功能提供了底层基础,用于与 Spring 的其他部分以及相关的第三方框架的集成
- ApplicationContext 在 BeanFactory 基础上还扩展了其他接口以提供更多面向应用程序框架和企业开发的附加功能。
下表列出了 BeanFactory 和 ApplicationContext 接口和实现提供的功能。
功能特性 | BeanFactory |
ApplicationContext |
---|---|---|
Bean实例化和属性注入 | Yes | Yes |
生命周期管理 | No | Yes |
BeanPostProcessor 自动注册 |
No | Yes |
BeanFactoryPotProcessor 自动注册 |
No | Yes |
国际化 MessageSource |
No | Yes |
内置的 ApplicationEvent 发布机制 |
No | Yes |
因为ApplicationContext包含BeanFactory的所有功能,所以通常建议使用它而不是普通的BeanFactory,除非需要完全控制bean处理的场景。
ApplicationContext的扩展能力
上面讨论了org.springframework.beans.factory
包提供了管理和操作bean的基本功能,包括以编程的方式。org.springframework.context
包添加了ApplicationContext接口,它扩展了BeanFactory接口,此外还扩展了其他接口,以更面向应用程序框架的方式提供额外的功能。
- 国际化: 通过 MessageSource 接口以 i18n 方式访问消息
- 通过 ResourceLoader 接口访问资源,例如 URL 和文件
- 事件发布,即通过使用 ApplicationEventPublisher 接口发布到实现 ApplicationListener 接口的 bean
- 通过 HierarchicalBeanFactory 接口加载多个(分层)上下文,让每个上下文都专注于一个特定的层,例如应用程序的 Web 层
国际化 MessageSource
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
Spring中查找加载MessageSource过程
- 加载 ApplicationContext 时,它会自动搜索上下文中定义的 MessageSource bean。 bean 必须具有名称 messageSource。
- 如果找到了这样的bean,那么对上述方法的所有调用都被委托给消息源。
- 如果没有找到消息源,ApplicationContext将尝试查找包含具有相同名称的bean的父类。如果有,则使用该bean作为MessageSource。
- 如果 ApplicationContext 找不到任何消息源,则实例化一个空的 DelegatingMessageSource 以便能够接受对上面定义的方法的调用。
MessageSource 实现
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 的案例,方便理解。
类路径定义国际化资源文件,定义默认和中文的
demo16/exceptions_en.properties 文件,支持{..}占位符内容替换
argument.required=The {0} argument is required.
demo16/exceptions_zh.properties 文件
argument.required={0} 参数是必须的.
demo16/format_zh.properties 文件
message=中文消息
demo16/format_en.properties 文件
message=en
注入 ResourceBundleMessageSource 实例,名称为 messageSource
@Configuration
@ComponentScan
public class AppConfig { @Bean("messageSource")
public ResourceBundleMessageSource messageSource() {
ResourceBundleMessageSource source = new ResourceBundleMessageSource();
// 设置类路径下的资源文件
source.setBasenames("demo16/format","demo16/exceptions","demo16/windows");
return source;
}
}
bean中调用 MessageSource 接口方法使用
@Component
public class MyBean {
@Autowired
private MessageSource messageSource; // 获取消息内容
public void execute() {
System.out.println("获取消息内容:");
String message = this.messageSource.getMessage("message", null, "Default", Locale.ENGLISH);
System.out.println(message);
} // 替换占位符内容 字符串形式
public void execute1() {
System.out.println(" 替换占位符内容 字符串形式: ");
String message = this.messageSource.getMessage("argument.required", new Object[]{"messageSource"},
"Required", Locale.ENGLISH);
System.out.println(message);
} // 获取中文消息
public void getChinesMessage() {
System.out.println("替换占位符内容 字符串形式,语言是中文: ");
String message = this.messageSource.getMessage("argument.required", new Object[]{"messageSource"},
"Required", Locale.CHINESE);
System.out.println(message);
}
}
测试并观察结果
@Test
public void test1() {
AnnotationConfigApplicationContext context =
new AnnotationConfigApplicationContext(AppConfig.class);
MyBean myBean = context.getBean(MyBean.class);
myBean.execute();
myBean.execute1();
myBean.getChinesMessage();
}
获取消息内容:
en
替换占位符内容 字符串形式:
The messageSource argument is required.
替换占位符内容 字符串形式,语言是中文:
messageSource 参数是必须的.
已经可以根据语言进行国际化切换了
总结
本文介绍了Spring中BeanFactory和AppplicationContext的对比,重点介绍了AppplicationContext中扩展实现国际化。
本篇源码地址: https://github.com/kongxubihai/pdf-spring-series/tree/main/spring-series-ioc/src/main/java/com/crab/spring/ioc/demo16
知识分享,转载请注明出处。学无先后,达者为先!
Spring系列16:ApplicationContext扩展国际化的更多相关文章
- 【Spring源码分析系列】ApplicationContext 相关接口架构分析
[原创文章,转载请注明出处][本文地址]http://www.cnblogs.com/zffenger/p/5813470.html 在使用Spring的时候,我们经常需要先得到一个Applicati ...
- 转:Spring系列之beanFactory与ApplicationContext
原文地址:Spring系列之beanFactory与ApplicationContext 一.BeanFactoryBeanFactory 是 Spring 的“心脏”.它就是 Spring IoC ...
- Spring Boot 系列教程16-数据国际化
internationalization(i18n) 国际化(internationalization)是设计和制造容易适应不同区域要求的产品的一种方式. 它要求从产品中抽离所有地域语言,国家/地区和 ...
- spring源码分析系列5:ApplicationContext的初始化与Bean生命周期
回顾Bean与BeanDefinition的关系. BeanFactory容器. ApplicationContext上下文. 首先总结下: 开发人员定义Bean信息:分为XML形式定义:注解式定义 ...
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列(16)-类库架构扩展以及DLL文件生成修改和用户的简单添加
原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(16)-类库架构扩展以及DLL文件生成修改和用户的简单添加 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) ...
- 7 -- Spring的基本用法 -- 4... 使用 Spring 容器:Spring 容器BeanFactory、ApplicationContext;ApplicationContext 的国际化支持;ApplicationContext 的事件机制;让Bean获取Spring容器;Spring容器中的Bean
7.4 使用 Spring 容器 Spring 有两个核心接口:BeanFactory 和 ApplicationContext,其中ApplicationContext 是 BeanFactory ...
- Spring系列(零) Spring Framework 文档中文翻译
Spring 框架文档(核心篇1和2) Version 5.1.3.RELEASE 最新的, 更新的笔记, 支持的版本和其他主题,独立的发布版本等, 是在Github Wiki 项目维护的. 总览 历 ...
- Spring 系列教程之容器的功能
Spring 系列教程之容器的功能 经过前面几章的分析,相信大家已经对 Spring 中的容器功能有了简单的了解,在前面的章节中我们一直以 BeanFacotry 接口以及它的默认实现类 XmlBea ...
- 死磕Spring之IoC篇 - Spring 应用上下文 ApplicationContext
该系列文章是本人在学习 Spring 的过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring 源码分析 GitHub 地址 进行阅读 Spring 版本:5.1. ...
随机推荐
- String存放位置
简介 字符串在不同的JDK版本中,存放的位置不同,创建方式不同,存放的位置也不同. 存放位置 JDK1.7以下,无论何种方法创建String对象,位置都位于方法区. JDK1.8及1.8以上,new ...
- Redis性能管理
Redis性能管理 目录 Redis性能管理 一.查看Redis内存使用 二.内存碎片率 三.内存使用率 四.避免内存交换发生的方法 1. Hash数据类型 1.1 HSET/HGET/HDEL/HE ...
- 谷粒商城Day1
环境搭建 安装JDK1.8: 1 下载并解压jdk1.8 tar -zxvf jdk-8u281-linux-x64.tar.gz(检查本机有没有jdk有的话卸载掉.安装上自己的jdk) 2 配上环境 ...
- spring mvc通过客户端传值,controller获取Sort对象
之前客户端需要根据需求按不同的排序方式查看数据,按照一种约定排序,比如1代表时间升序,2代表时间降序,3,4这种形式,然后后台根据这些值创建Sort对象. 后来发现完全多此一举,可以根据特定的方式,直 ...
- Elasticsearch按请求体基本查询
1 分页: localhost:9200/get-together/_search {"query": {"match_all": {}},"from ...
- Linux性能优化概述
一.Linux性能概述 性能优化是个系统工程,总是牵一发而动全身,它涉及了从程序设计.编程语言,再到系统.存储.网络等各种底层基础设施的方方面面.每一个组件都有可能出问题,而且很有可能多个组件同时出问 ...
- 云原生 PostgreSQL 集群 - PGO:来自 Crunchy Data 的 Postgres Operator
使用 PGO 在 Kubernetes 上运行 Cloud Native PostgreSQL:来自 Crunchy Data 的 Postgres Operator! Cloud Native Po ...
- linux历史命令审计
一.添加历史命令记录 1.首先在/etc/profile中添加 export HISTORY_FILE=/var/log/Command/Command.log export PROMPT_COMMA ...
- 【C# 线程】线程局部存储(TLS)理论部分 ThreadStatic|LocalDataStoreSlot|ThreadLocal<T>
线程本地存储(TLS:Thread Local Storage) 线程本地存储(Thread Local Storage),字面意思就是专属某个线程的存储空间.变量大体上分为全局变量和局部变量,一个进 ...
- Hadoop配置文件汇总
(一)基本集群配置 共8个配置文件 hadoop-env.sh yarn-env.sh mapred-env.sh core-site.xml hdfs-site.xml yarn-site.xml ...