• spring5.0 源码解析(day05) initMessageSource();


    @[TOC](spring5.0 源码解析(day04) initMessageSource()😉

    initMessageSource 使用

    该方法主要 对上下文的消息来源进行初始化

    1. 我们先在项目中创建国际化文件
      在这里插入图片描述
    2. 在配置类中增加如下配置
    @Bean(name = "messageSource")
    	public MessageSource getMessageSource() {
    		ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
    		messageSource.setDefaultEncoding("UTF-8");
    		messageSource.addBasenames("message", "message_en");
    		return messageSource;
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    1. 通过容器获取 messageSource
    MessageSource messageSource = applicationContext.getBean(MessageSource.class);
    		String zhMessage = messageSource.getMessage("base.response.success.msg", null, null, Locale.CHINA);
    		String enMessage = messageSource.getMessage("base.response.fail.msg", null, null, Locale.ENGLISH);
    		System.out.println("zhMessage = " + zhMessage);
    		System.out.println("enMessage = " + enMessage);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    1. 启动项目打印结果
    zhMessage = 成功
    enMessage = fail
    
    • 1
    • 2

    initMessageSource 解析

    在 initMessageSource 方法中 我们可以看到,先检查beanFactory是否存在messageSource 的bean,不存在则初始化一个默认的messageSource 防止 getMessage 调用是出现问题

    ConfigurableListableBeanFactory beanFactory = getBeanFactory();
    		// Bean 的名称必须要是 messageSource
    		if (beanFactory.containsLocalBean(MESSAGE_SOURCE_BEAN_NAME)) {
    			this.messageSource = beanFactory.getBean(MESSAGE_SOURCE_BEAN_NAME, MessageSource.class);
    			// 让 MessageSource 知道父 MessageSource.
    			if (this.parent != null && this.messageSource instanceof HierarchicalMessageSource) {
    				HierarchicalMessageSource hms = (HierarchicalMessageSource) this.messageSource;
    				if (hms.getParentMessageSource() == null) {
    					// 如果尚未注册父消息源,则仅将父上下文设置为父消息源。
    					// 已经注册.
    					hms.setParentMessageSource(getInternalParentMessageSource());
    				}
    			}
    			if (logger.isTraceEnabled()) {
    				logger.trace("Using MessageSource [" + this.messageSource + "]");
    			}
    		}
    		else {
    			// 使用空的 MessageSource 能够接受 getMessage 调用.
    			DelegatingMessageSource dms = new DelegatingMessageSource();
    			dms.setParentMessageSource(getInternalParentMessageSource());
    			this.messageSource = dms;
    			beanFactory.registerSingleton(MESSAGE_SOURCE_BEAN_NAME, this.messageSource);
    			if (logger.isTraceEnabled()) {
    				logger.trace("No '" + MESSAGE_SOURCE_BEAN_NAME + "' bean, using [" + this.messageSource + "]");
    			}
    		}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
  • 相关阅读:
    安卓将图片分割或者拉伸或者旋转到指定尺寸并保存到本地
    php万能表单系统源码 支持自定义+收费表单活动报名 适合多行业
    Mysql系列二:Mysql里的锁
    如何通过NTC热敏电阻计算温度(一)---理论篇
    【机器学习入门项目10例】(十):PCA降维:简易人脸识别模型
    Flink K8S Operator 离线安装
    MongoDB基本操作增删改查
    使用crul库和R语言的下载器程序
    【数仓精品理论分析】能不能学大数据?
    Python定义函数
  • 原文地址:https://blog.csdn.net/qq_44808472/article/details/126184231