④、Spring-->refresh()-->initMessageSource()


前言

initMessageSource()的作用是初始化国际化文件

直接看代码

protected void initMessageSource() {
	ConfigurableListableBeanFactory beanFactory = getBeanFactory();
	----------1、MESSAGE_SOURCE_BEAN_NAME=messageSource;
	----------这也是为什么@Bean(name = "messageSource") name一定要是messageSource的原因。
	if (beanFactory.containsLocalBean(MESSAGE_SOURCE_BEAN_NAME)) {
		---------2、如果存在beanFactory中定义了beanDefinition为messageSource,
		----------就把当前容器的messageSource设置为配置的。
		this.messageSource = beanFactory.getBean(MESSAGE_SOURCE_BEAN_NAME, MessageSource.class);
		// Make MessageSource aware of parent MessageSource.
		if (this.parent != null && this.messageSource instanceof HierarchicalMessageSource) {
			HierarchicalMessageSource hms = (HierarchicalMessageSource) this.messageSource;
			if (hms.getParentMessageSource() == null) {
				// Only set parent context as parent MessageSource if no parent MessageSource
				// registered already.
				hms.setParentMessageSource(getInternalParentMessageSource());
			}
		}
		if (logger.isDebugEnabled()) {
			logger.debug("Using MessageSource [" + this.messageSource + "]");
		}
	}
	else {
		// Use empty MessageSource to be able to accept getMessage calls.
		DelegatingMessageSource dms = new DelegatingMessageSource();
		dms.setParentMessageSource(getInternalParentMessageSource());
		this.messageSource = dms;
		beanFactory.registerSingleton(MESSAGE_SOURCE_BEAN_NAME, this.messageSource);
		if (logger.isDebugEnabled()) {
			logger.debug("Unable to locate MessageSource with name '" + MESSAGE_SOURCE_BEAN_NAME +
					"': using default [" + this.messageSource + "]");
		}
	}
}

具体使用

1、新加两个配置文件message_en_US.properties和message_zh_CN.properties

message_en_US.properties内容如下:

user.name=zhangsan

message_zh_CN.properties内容如下

user.name=张三

2、配置类中添加@Bean(name=“message”)

@Configuration
-------basePackages为具体的扫描包路径。
@ComponentScan(basePackages = "xxx.xxx.xx")
public class MainConfig {
    //在 MainConfig 中 声明 MessageSource , 记得名字一定要叫做 messageSource !

    @Bean(name = "messageSource")
    public MessageSource getMessageSource() {
        ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
        messageSource.setDefaultEncoding("UTF-8");
        --------addBasenames添加的字符串为
        --------message_en_US.properties和message_zh_CN.properties文件名前缀
        messageSource.addBasenames("message");
        return messageSource;
    }

}

3、执行main方法

public class MainClass {

    public static void main(String[] args) {
        AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(MainConfig.class);

        String ctxzhMessage = ctx.getMessage("user.name", null, null, Locale.CHINA);
        String ctxenMessage = ctx.getMessage("user.name", null, null, Locale.US);
        System.out.println("ctxzhMessage = "+ ctxzhMessage);
        System.out.println("ctxenMessage = "+ ctxenMessage);

		--------上面直接从ctx.getMessage(xxxx)--------下面获取了ctx.getBean(MessageSource.class)的结果是一样的。
        MessageSource messageSource = ctx.getBean(MessageSource.class);

        String zhMessage = messageSource.getMessage("user.name", null, null, Locale.CHINA);
        String enMessage = messageSource.getMessage("user.name", null, null, Locale.US);
        String defMessage = messageSource.getMessage("user.name", null, null, Locale.getDefault());
        System.out.println("zhMessage = " + zhMessage);
        System.out.println("enMessage = " + enMessage);
        System.out.println("defMessage = " + defMessage);

        ctx.close();
    }
}

上面的执行结果如下

ctxzhMessage = 张三
ctxenMessage = zhangsan
zhMessage = 张三
enMessage = zhangsan
defMessage = 张三
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值