前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SpringBoot源码学习(六)

SpringBoot源码学习(六)

作者头像
写一点笔记
发布2020-09-21 15:02:55
3110
发布2020-09-21 15:02:55
举报
文章被收录于专栏:程序员备忘录程序员备忘录

上期在registerBeanPostProcessors方法中,我们发现spring将beanDefinitionMap中的bean的后置处理器全部按照顺序注册到了IOC中的BeanPostProcessor中。那么显然这块也是有顺序的。否则肯定会导致一些方法调用不到。而这里的后置处理器显然是在getBean方法中被调用的。这里我们先不探索getBean方法,我们还是先建立自己的逻辑大厦,这有助于我们更好的学习spring。

今天我们学习initMessageSource方法。

看到initMessageSource您能想到什么?我们知道在spring国际化中有个类叫做messageSource,那么个人觉得这个init就是国际化bean的初始化了。我们知道在国际化的初始化过程中我们只需要指定国际化配置的路径即可。那么这里的是否会有这样的逻辑?

代码语言:javascript
复制
  protected void initMessageSource() {
    //拿到beanFactory
    ConfigurableListableBeanFactory beanFactory = getBeanFactory();
    if (beanFactory.containsLocalBean(MESSAGE_SOURCE_BEAN_NAME)) {
    //如果已经包含了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) {
           //设置父的messageSource
          hms.setParentMessageSource(getInternalParentMessageSource());
        }
      }
      if (logger.isTraceEnabled()) {
        logger.trace("Using MessageSource [" + this.messageSource + "]");
      }
    }
    else {
      //重新创建一个MessageSource并注册到容器中
      DelegatingMessageSource dms = new DelegatingMessageSource();
      dms.setParentMessageSource(getInternalParentMessageSource());
      this.messageSource = dms;
      //注册一个单例的messageBean
      beanFactory.registerSingleton(MESSAGE_SOURCE_BEAN_NAME, this.messageSource);
      if (logger.isTraceEnabled()) {
        logger.trace("No '" + MESSAGE_SOURCE_BEAN_NAME + "' bean, using [" + this.messageSource + "]");
      }
    }
  }

通过查看源代码,发现messageSource其实就是springIOC的一个局部变量。但是到目前为止我们并没有将messageSoruce的初始化方法找到,我们知道在message中需要添加很多实例,然后才能处理国际化问题。但目前为止我们还没有找到相关的类。但是我们看到这里直接将messageSource初始化并注册进去了。那么显然会在之后的操作中获取这个MessageSoruce然后对其进行赋值操作。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-09-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员备忘录 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档