本文内容

  1. BeanFactory对比ApplicationContext

  2. ApplicationContext的扩展能力

  3. 国际化

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 的案例,方便理解。

  1. 类路径定义国际化资源文件,定义默认和中文的

    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
  2. 注入 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;
    }
    }
  3. 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);
    }
    }
  4. 测试并观察结果

    @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扩展国际化的更多相关文章

  1. 【Spring源码分析系列】ApplicationContext 相关接口架构分析

    [原创文章,转载请注明出处][本文地址]http://www.cnblogs.com/zffenger/p/5813470.html 在使用Spring的时候,我们经常需要先得到一个Applicati ...

  2. 转:Spring系列之beanFactory与ApplicationContext

    原文地址:Spring系列之beanFactory与ApplicationContext 一.BeanFactoryBeanFactory 是 Spring 的“心脏”.它就是 Spring IoC ...

  3. Spring Boot 系列教程16-数据国际化

    internationalization(i18n) 国际化(internationalization)是设计和制造容易适应不同区域要求的产品的一种方式. 它要求从产品中抽离所有地域语言,国家/地区和 ...

  4. spring源码分析系列5:ApplicationContext的初始化与Bean生命周期

    回顾Bean与BeanDefinition的关系. BeanFactory容器. ApplicationContext上下文. 首先总结下: 开发人员定义Bean信息:分为XML形式定义:注解式定义 ...

  5. ASP.NET MVC+EF框架+EasyUI实现权限管理系列(16)-类库架构扩展以及DLL文件生成修改和用户的简单添加

    原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(16)-类库架构扩展以及DLL文件生成修改和用户的简单添加 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) ...

  6. 7 -- Spring的基本用法 -- 4... 使用 Spring 容器:Spring 容器BeanFactory、ApplicationContext;ApplicationContext 的国际化支持;ApplicationContext 的事件机制;让Bean获取Spring容器;Spring容器中的Bean

    7.4 使用 Spring 容器 Spring 有两个核心接口:BeanFactory 和 ApplicationContext,其中ApplicationContext 是 BeanFactory ...

  7. Spring系列(零) Spring Framework 文档中文翻译

    Spring 框架文档(核心篇1和2) Version 5.1.3.RELEASE 最新的, 更新的笔记, 支持的版本和其他主题,独立的发布版本等, 是在Github Wiki 项目维护的. 总览 历 ...

  8. Spring 系列教程之容器的功能

    Spring 系列教程之容器的功能 经过前面几章的分析,相信大家已经对 Spring 中的容器功能有了简单的了解,在前面的章节中我们一直以 BeanFacotry 接口以及它的默认实现类 XmlBea ...

  9. 死磕Spring之IoC篇 - Spring 应用上下文 ApplicationContext

    该系列文章是本人在学习 Spring 的过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring 源码分析 GitHub 地址 进行阅读 Spring 版本:5.1. ...

随机推荐

  1. 乐动ld06激光雷达sdk改bug记录分享

    前言: 工作中,有使用过乐动ld06款激光雷达,此款雷达将常规雷达的转动的电机部分内置于自己的保护罩内,减少了雷达本身转动积灰等其他外界影响,探测半径是12m,是一款不错的雷达. 不过今天的主要内容不 ...

  2. IT职业技能图谱:架构师、H5、DBA、移动、大数据、运维...

    转载 作者:StuQ 文章收藏自微信:InfoQ   时隔近5个月,StuQ的小伙伴们再次出品了IT职业技能图谱更新版.这回除更新之前版本外,还添加了架构师.HTML 5.DBA等新的职业技能图谱.正 ...

  3. yum 搭建私有仓库

    今日内容 Linux 中安装软件的三种方法 yum 私有仓库 selinux 和 firewalld (iprables) 解决系统乱码 内容详细 一.Linux 安装软件的三种方法 rpm安装.yu ...

  4. Solution -「洛谷 P5236」「模板」静态仙人掌

    \(\mathcal{Description}\)   Link.   给定一个 \(n\) 个点 \(m\) 条边的仙人掌,\(q\) 组询问两点最短路.   \(n,q\le10^4\),\(m\ ...

  5. kali linux 中python2不带pip的解决方法

    在使用kali2020版本时,发现pip只能安装python3的模块,没办法安装python2模块,但是我有需要用到python2来运行脚本,在此贴出解决办法 https://bootstrap.py ...

  6. “四大高手”为你的 Vue 应用程序保驾护航

    全球都在处理数字化转型的问题,飞速发展的同时也为基础设施带来了一定的压力.同时许多黑客也在不断更新升级他们的攻击技术. 如果我们的应用程序有过多漏洞,被抓按住利用,就会变成大型芭比Q现场. 这也是为何 ...

  7. 【windows 操作系统】进程

    前言 Windows的内部实现也近似于"一切皆文件"的思想,当然,这一切都只在内核里才有,下载一个WinObj这软件就可以看到,Windows上各种设备.分区.虚拟对象都是挂载到根 ...

  8. 范围运算符和索引的最终运算符 ^ 在string 和数组中的应用

    //范围运算符在string 和数组中的应用 static void Main(string[] args) { string examplestring = "123456789" ...

  9. over the Wall

    最近风头很紧,先上两个可用的谷歌镜像给各位应急. https://kfd.me/ http://gufenso.coderschool.cn/ https://github.com/gfw-break ...

  10. 什么是句柄C#

    话不多说,下面分享下我对句柄的看法. 如果没有意外的话,ABCDE他们将依次进行占用CPU资源.但是可能会发生如下情况 句柄,就是用来维护进程或者系统范围内的一个标识.就比如我们去访问一个文件的时候, ...