前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring-IoC -加载 Bean-总览

Spring-IoC -加载 Bean-总览

作者头像
程序员酷森
发布2020-10-19 16:31:02
4590
发布2020-10-19 16:31:02
举报
文章被收录于专栏:Java面试精选

2.1 获取 beanName

代码如下:

1 2 3

// AbstractBeanFactory.java final String beanName = transformedBeanName(name);

这段代码的作用:这里传递的是 name 方法,不一定就是 beanName,可能是 aliasName ,也有可能是 FactoryBean ,所以这里需要调用 #transformedBeanName(String name) 方法,对 name 进行一番转换。

1 2 3 4 5

// AbstractBeanFactory.java protected String transformedBeanName(String name) { return canonicalName(BeanFactoryUtils.transformedBeanName(name)); }

这里的转换过程包括两部分,一是去除 FactoryBean 的修饰符,二是取指定的 alias 所表示的最终 beanName 。详细分析如下:

  1. 调用 BeanFactoryUtils#transformedBeanName(String name) 方法,去除 FactoryBean 的修饰符。代码如下:
代码语言:javascript
复制
// BeanFactoryUtils.java
   
private static final Map<String, String> transformedBeanNameCache = new ConcurrentHashMap<>();
   
public static String transformedBeanName(String name) {
     Assert.notNull(name, "'name' must not be null");
     if (!name.startsWith(BeanFactory.FACTORY_BEAN_PREFIX)) {
         return name;
     }
     // BeanFactory.FACTORY_BEAN_PREFIX = "&"
     // 就是去除传入 name 参数的 "&" 的前缀。
     // computeIfAbsent 方法是jdk的代码,分成两种情况:
     //  1. 未存在,则进行计算执行,并将结果添加到缓存。
     //  2. 已存在,则直接返回,无需计算。
     return transformedBeanNameCache.computeIfAbsent(name, beanName -> {
         do {
             beanName = beanName.substring(BeanFactory.FACTORY_BEAN_PREFIX.length());
         }
         while (beanName.startsWith(BeanFactory.FACTORY_BEAN_PREFIX));
         return beanName;
     });
 }
代码语言:javascript
复制
public String canonicalName(String name) {
      String canonicalName = name;
      String resolvedName;
      // 循环,从 aliasMap 中,获取到最终的 beanName
      do {
          resolvedName = this.aliasMap.get(canonicalName);
          if (resolvedName != null) {
              canonicalName = resolvedName;
          }
      }
      while (resolvedName != null);
      return canonicalName;
  }

主要是一个循环获取 beanName 的过程,例如,别名 A 指向名称为 B 的 bean 则返回 B;若 别名 A 指向别名 B,别名 B 指向名称为 C 的 bean,则返回 C。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-04-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 2.1 获取 beanName
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档