Spring框架之注册—SimpleAliasRegistry实现类

来源:互联网 发布:淘宝卖东西必须开店吗 编辑:程序博客网 时间:2024/06/10 09:59

一、SimpleAliasRegistry简介

SimpleAliasRegistry是AliasRegistry接口的简单实现,通过别名缓存(aliasMap)对别名的增删改查等基本实现。

二、SimpleAliasRegistry源码详解

public class SimpleAliasRegistry implements AliasRegistry {    /** 存放别名的缓存 */    private final Map<String, String> aliasMap = new ConcurrentHashMap<String, String>(16);    /**      * 给指定的Bean名称指定别名     */    @Override    public void registerAlias(String name, String alias) {        Assert.hasText(name, "'name' must not be empty");        Assert.hasText(alias, "'alias' must not be empty");        if (alias.equals(name)) {            this.aliasMap.remove(alias);        }        else {            String registeredName = this.aliasMap.get(alias);            if (registeredName != null) {                if (registeredName.equals(name)) {                    // An existing alias - no need to re-register                    return;                }                if (!allowAliasOverriding()) {                    throw new IllegalStateException("Cannot register alias '" + alias + "' for name '" +                            name + "': It is already registered for name '" + registeredName + "'.");                }            }            checkForAliasCircle(name, alias);            this.aliasMap.put(alias, name);        }    }    /**     * 返回是否允许覆盖别名,默认为允许。     */    protected boolean allowAliasOverriding() {        return true;    }    /**     * 判断指定的Bean名称是否有指定的别名     */    public boolean hasAlias(String name, String alias) {        for (Map.Entry<String, String> entry : this.aliasMap.entrySet()) {            String registeredName = entry.getValue();            if (registeredName.equals(name)) {                String registeredAlias = entry.getKey();                return (registeredAlias.equals(alias) || hasAlias(registeredAlias, alias));            }        }        return false;    }    /**     * 删除指定的别名     */    @Override    public void removeAlias(String alias) {        String name = this.aliasMap.remove(alias);        if (name == null) {            throw new IllegalStateException("No alias '" + alias + "' registered");        }    }    /**     * 判断指定的名称是否为别名     */    @Override    public boolean isAlias(String name) {        return this.aliasMap.containsKey(name);    }    /**     * 返回指定的Bean名称的所有别名     */    @Override    public String[] getAliases(String name) {        List<String> result = new ArrayList<String>();        synchronized (this.aliasMap) {            retrieveAliases(name, result);        }        return StringUtils.toStringArray(result);    }    /**     * 递归检索指定的Bean的所有别名     */    private void retrieveAliases(String name, List<String> result) {        for (Map.Entry<String, String> entry : this.aliasMap.entrySet()) {            String registeredName = entry.getValue();            if (registeredName.equals(name)) {                String alias = entry.getKey();                result.add(alias);                retrieveAliases(alias, result);            }        }    }    /**     * 根据StringValueResolver解析为对应的别名     */    public void resolveAliases(StringValueResolver valueResolver) {        Assert.notNull(valueResolver, "StringValueResolver must not be null");        synchronized (this.aliasMap) {            Map<String, String> aliasCopy = new HashMap<String, String>(this.aliasMap);            for (String alias : aliasCopy.keySet()) {                String registeredName = aliasCopy.get(alias);                String resolvedAlias = valueResolver.resolveStringValue(alias);                String resolvedName = valueResolver.resolveStringValue(registeredName);                if (resolvedAlias == null || resolvedName == null || resolvedAlias.equals(resolvedName)) {                    this.aliasMap.remove(alias);                }                else if (!resolvedAlias.equals(alias)) {                    String existingName = this.aliasMap.get(resolvedAlias);                    if (existingName != null) {                        if (existingName.equals(resolvedName)) {                            // Pointing to existing alias - just remove placeholder                            this.aliasMap.remove(alias);                            break;                        }                        throw new IllegalStateException(                                "Cannot register resolved alias '" + resolvedAlias + "' (original: '" + alias +                                "') for name '" + resolvedName + "': It is already registered for name '" +                                registeredName + "'.");                    }                    checkForAliasCircle(resolvedName, resolvedAlias);                    this.aliasMap.remove(alias);                    this.aliasMap.put(resolvedAlias, resolvedName);                }                else if (!registeredName.equals(resolvedName)) {                    this.aliasMap.put(alias, resolvedName);                }            }        }    }    /**     * 检查给定的名称是否指向别名作为别名(死循环)     */    protected void checkForAliasCircle(String name, String alias) {        if (hasAlias(alias, name)) {            throw new IllegalStateException("Cannot register alias '" + alias +                    "' for name '" + name + "': Circular reference - '" +                    name + "' is a direct or indirect alias for '" + alias + "' already");        }    }    /**     * 判断原始名称,解析别名为规范名称     */    public String canonicalName(String name) {        String canonicalName = name;        // Handle aliasing...        String resolvedName;        do {            resolvedName = this.aliasMap.get(canonicalName);            if (resolvedName != null) {                canonicalName = resolvedName;            }        }        while (resolvedName != null);        return canonicalName;    }}
阅读全文
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 苹果手机长按不能删除怎么办 qq发的图片过期怎么办 九黎八卦在仓库怎么办 飞猪f2领了万豪银卡没住怎么办 机械键盘摁键冲突怎么办 玩游戏键盘没反应怎么办 玩枪战游戏头晕恶心怎么办 手机看视频不能横屏怎么办 苹果手机安全码忘记了怎么办 信用卡安全码忘记了怎么办 联想电脑管家阻止我安装软件怎么办 word恢复后打开乱码怎么办 苹果手机局域网也登陆不了怎么办 剑三账号冻结7天怎么办 荒野行动无缘无故被限制时间怎么办 电脑打游戏闪屏怎么办 微信下载出现数据包出错怎么办 安卓平板闪退怎么办 剑侠世界2出了1怎么办 苹果手机有木马病毒删除不了怎么办 苹果手机病毒了怎么办【解决方法】 苹果手机点击病毒链接怎么办 苹果手机有病毒啦怎么办 苹果7p反复重启怎么办 苹果手机屏幕触屏不灵怎么办 苹果手机屏翘起来了怎么办 苹果x手机触屏失灵怎么办 苹果7手机变成黑白屏怎么办 苹果手机屏不动了怎么办 苹果6老是卡屏怎么办 苹果x卡屏死机怎么办 苹果6死机卡屏怎么办 苹果手机主屏死机怎么办 苹果7手机卡屏死机怎么办 苹果6s卡死了怎么办 6s手机显示丢失锁定怎么办 酷比s9被root怎么办 垃圾清理把相片删除了怎么办 小米电脑怎么下载软件怎么办 华为手机pin码忘了怎么办 锁屏密码忘了怎么办