zoukankan      html  css  js  c++  java
  • Spring源码之SimpleAliasRegistry解读(一)

    Spring源码之SimpleAliasRegistry解读(一)

    阅读spring源码中org.springframework.core.SimpleAliasRegistry类时发现该类主要是使用map作为alias的缓存,并对接口AliasRegistry进行实现。

    在阅读该源码中对hasAlias(String name, String alias);方法产生了疑惑。源码注释中解释该方法的作用是:确定给定的名称是否已注册了给定的别名。

    该方法源码如下:

    public boolean hasAlias(String name, String alias) {
            //遍历Map
            for (Map.Entry<String, String> entry : this.aliasMap.entrySet()) {
                //获取值
                String registeredName = entry.getValue();
                //判断该值与传入的name是否相等
                if (registeredName.equals(name)) {
                    //如果相等,则获取该值对应得键
                    String registeredAlias = entry.getKey();
                    //判断该键与传入的别名是否相等,如果相等则返回true
                    //如果不想等,则将该键与传入的别名作为此方法的参数,进行递归调用
                    return (registeredAlias.equals(alias) || hasAlias(registeredAlias, alias));
                }
            }
            return false;
        }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    以及使用到的成员变量是:

    private final Map<String, String> aliasMap = new ConcurrentHashMap<String, String>(16);
    • 1
    • 1

    为了分析我为每行添加了注释,刚开始使我不能理解的是return (registeredAlias.equals(alias) || hasAlias(registeredAlias, alias)); 这行代码。为什么递归调用hasAlias方法时传入的第一个参数不是name。

    经过分析,发现设计该map时,不是为了存放单一的键值对。

    我想到了两种假设:

    假设一:map是存放一个类似于倒着的树。name是作为根节点而存在的,alias是作为根节点下的子节点。但是又出现一个问题,按hasAlias这个方法来循环遍历是永远也遍历不到所有父节点下的第二个子节点,所以这个假设被否定。

    假设二:一条节点链。name是该链的头,alias是该链除了头之外的其他节点,只要传入该方法的alias是该链的除头部之外的某一节点,返回的就是true,和方法给定的解释正好吻合。

    如果解释的不对,请读者朋友留言告知,谢谢!

  • 相关阅读:
    Android开发之LocationManager和定位
    Android开发之SmsManager和SmsMessage
    Android开发之三种动画
    Android开发之ActivityManager获取系统信息
    Android开发之TextView实现跑马灯效果
    Android开发之MD5加密
    linux服务之dns
    java使用Redis(六个类型)
    JedisConnectionException: Failed connecting to host localhost:6379
    下载安装Redis+使用
  • 原文地址:https://www.cnblogs.com/handsome1013/p/5944376.html
Copyright © 2011-2022 走看看