• 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
  • 相关阅读:
    SpringCloud搭建保姆级教程
    APAUNet
    实验三、拓扑布局和建立小型网络《计算机网络》
    java实现课程表 II
    SBT安装与配置
    Angular10.0项目中使用mock.js
    数据结构与算法--并查集结构
    以太坊EVM智能合约中的数据存储
    英文论文(sci)解读复现【NO.21】一种基于空间坐标的轻量级目标检测器无人机航空图像的自注意
    npm install导致的OOM解决方案
  • 原文地址:https://blog.csdn.net/qq_44808472/article/details/126184231