一、国际化在实际代码中是非常常见的一中方式。为了结合web做一下语言上面的切换,而达到展示的目的。

  二、这里呢,主要是介绍spring中对于国际化做了哪些处理。

  三、实现方式

  1)xml配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
  
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basenames">
<list>
<value>message.test</value>
</list>
</property>
</bean>
</beans>

  备注:<!--这里id必须是messageSource,后续会说为什么-->

  2)语言文件

   

  写法:

testtest=\u6d4b\u8bd5{0}
testtest=test{0}

  3)应用过程:

     ApplicationContext context = new ClassPathXmlApplicationContext("spring-message.xml");
ResourceBundleMessageSource messageSource = context.getBean("messageSource", ResourceBundleMessageSource.class);
String messageZh = messageSource.getMessage("testtest", new Object[]{"数据"}, Locale.CHINESE);
String messageEn = messageSource.getMessage("testtest", new Object[]{"data"}, Locale.ENGLISH);
System.out.println(messageZh);
System.out.println(messageEn);

  4)效果

  

  四、当然这里只是后台的实现方式,因为是国际化吗。肯定是和web端密切相关的。传递方式

  1)request:设置消息头等。通过拦截请求设置获取当前语言。然后在后端处理国际化。

  2)cookie:这种方式通过请求的方式修改语言。

<bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver">
<property name="cookieMaxAge" value="1800000"/>
<property name="defaultLocale" value="zh_CN"/>
<property name="cookieName" value="Language"/>
</bean>

  3)session:这个方式的好处是在于会话处理。相对于cookie,会话可以根据session的时间而保持。

  <bean id="sessionLocaleResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver">
<property name="defaultLocale" value="zh"/>
</bean>

  五、spring部分

  1)refresh()方法中的this.initMessageSource();

  2)实现:

protected voidinitMessageSource() {
//获取beanfactory
ConfigurableListableBeanFactory beanFactory = this.getBeanFactory();
//判断是否包含messageSource的bean
if (beanFactory.containsLocalBean("messageSource")) {
this.messageSource = (MessageSource)beanFactory.getBean("messageSource", MessageSource.class);
//如果父类存在,设置父类
if (this.parent != null && this.messageSource instanceof HierarchicalMessageSource) {
HierarchicalMessageSource hms = (HierarchicalMessageSource)this.messageSource;
if (hms.getParentMessageSource() == null) {
hms.setParentMessageSource(this.getInternalParentMessageSource());
}
}
if (this.logger.isDebugEnabled()) {
this.logger.debug("Using MessageSource [" + this.messageSource + "]");
}
} else {
//spring默认的国际化使用方式
DelegatingMessageSource dms = new DelegatingMessageSource();
dms.setParentMessageSource(this.getInternalParentMessageSource());
this.messageSource = dms;
beanFactory.registerSingleton("messageSource", this.messageSource);
if (this.logger.isDebugEnabled()) {
this.logger.debug("Unable to locate MessageSource with name 'messageSource': using default [" + this.messageSource + "]");
}
}
}

  3)从代码中可以看出:这里默认访问的是messageSource,如果配置成其他名称。在使用的时候会抛类型异常。

  六、简易版国际化实现过程

     ResourceBundle resourceBundle = ResourceBundle.getBundle("message.test", Locale.US);
String testest = resourceBundle.getString("testtest");
String format = MessageFormat.format(testest, new Object[]{"data"});
System.out.println(format);

  

spring源码-国际化-3.5的更多相关文章

  1. spring源码-bean之增强初始化-3

    一.ApplicationContext的中文意思是“应用上下文”,它继承自BeanFactory接口,除了包含BeanFactory的所有功能之外,在国际化支持.资源访问(如URL和文件).事件传播 ...

  2. Spring 源码(8)Spring BeanPostProcessor的注册、国际化及事件发布机制

    上一篇文章https://www.cnblogs.com/redwinter/p/16198942.html介绍了Spring的注解的解析过程以及Spring Boot自动装配的原理,大概回顾下:Sp ...

  3. spring源码:学习线索(li)

    一.spring xml配置(不包括AOP,主要了解在初始化及实例化过程中spring配置文件中每项内容的具体实现过程,从根本上掌握spring) <bean>的名字 &,alia ...

  4. spring源码浅析——IOC

    =========================================== 原文链接: spring源码浅析--IOC   转载请注明出处! ======================= ...

  5. 【Spring源码分析】Bean加载流程概览

    代码入口 之前写文章都会啰啰嗦嗦一大堆再开始,进入[Spring源码分析]这个板块就直接切入正题了. 很多朋友可能想看Spring源码,但是不知道应当如何入手去看,这个可以理解:Java开发者通常从事 ...

  6. 【Spring源码分析】非懒加载的单例Bean初始化前后的一些操作

    前言 之前两篇文章[Spring源码分析]非懒加载的单例Bean初始化过程(上篇)和[Spring源码分析]非懒加载的单例Bean初始化过程(下篇)比较详细地分析了非懒加载的单例Bean的初始化过程, ...

  7. 【spring源码分析】IOC容器初始化(一)

    前言:spring主要就是对bean进行管理,因此IOC容器的初始化过程非常重要,搞清楚其原理不管在实际生产或面试过程中都十分的有用.在[spring源码分析]准备工作中已经搭建好spring的环境, ...

  8. spring源码:学习线索

    一.spring xml配置(不包括AOP,主要了解在初始化及实例化过程中spring配置文件中每项内容的具体实现过程,从根本上掌握spring) <bean>的名字 &,alia ...

  9. [spring源码] 小白级别的源码解析(一)

    一直都在用spring,但是每次一遇到spring深入的问题,就是比较懵的状态.最近花了段时间学习了一下spring源码. 1,spring版本介绍 虽然工作中,一直在用到spring,可能有时候,并 ...

随机推荐

  1. 使用npoi插件将excel文件导出

    大致流程:前端使用URL地址的方式跳转到action后返回file类型数据 js: window.location.href = '/Home/index?Id=' + id 后台代码: /// &l ...

  2. Hibernate多对多关联关系

    今天遇到一个问题:有一个的类Reckoning,一个类AccountItem.这两个类之间的关系时多对多的关联关系. 一开始是由AccountItem来维护关联关系的,也就是Reckoning.hbm ...

  3. openCV2马拉松第19圈——Harris角点检測(自己实现)

    计算机视觉讨论群162501053 转载请注明:http://blog.csdn.net/abcd1992719g/article/details/26824529 收入囊中 使用OpenCV的con ...

  4. perl的一些小函数——split、join、sort

    有时候,我们需要将一个字符串或一行文本通过某种方式转换为单个的元素存储在数组中,或者将许多元素通过某种分割符,将他们组合成一个字符串.perl刚好就提供了这样的功能,通过split或者join分割或组 ...

  5. tp3.2替换模板中如果需要替换的图片在css样式表中怎么办?

    因为标签中的 style 定义的样式可直接覆盖 css样式表中定义的样式,所以可以在要替换的标签中用 style 直接定义样式,具体代码如下: <div class="aboutbg& ...

  6. win7 xampp php7 yii2 配置sqlserver

    第一步: https://www.microsoft.com/en-us/download/details.aspx?id=20098   下载  如下图   php7 版本 放到 xampp\php ...

  7. 说说application/x-www-form-urlencoded和application/json的区别

    今天一位同事在于微信小程序开发人员那边在对接测试的时候,遇到了一个错误,安卓那边是以application/json作为请求体类型,而Java这边仍向往常那样没有多么大的变化,但是就是前台传输的数据为 ...

  8. FactoryBean的实现原理与作用

    FactoryBean与BeanFactory: 这俩货在拼写上很是相似,很多同学在看IOC源码或者其他地方并不能分清有啥区别,前面的IOC源码中我简单说过,现在统一简单来讲一下: FactoryBe ...

  9. [转]Python中下划线以及命名空间的意义

    Python 用下划线作为变量前缀和后缀指定特殊变量/方法. 主要存在四种情形 1. 1. object # public    2. __object__ # special, python sys ...

  10. python入门基础:文件的读写

    文件的读写操作运用广泛,无论是何种语言都会涉及到文件的输入输出. 下面简单的总结一下文件的读写: 1:open()函数 f = open('workfile', 'w') 函数 open()返回文件的 ...