Spring源码分析SimpleAliasRegistry类

AliasRegistry接口

声明对别名的注册、删除等基本方法。
所属包:org.springframework.core

声明方法

  1. 为一个规范名称(canonical name)注册一个别名,如果别名已存在,抛出IllegalStateException异常
void registerAlias(String name, String alias);
  1. 删除指定别名,如果没有指定的别名存在,抛出IllegalStateException异常
void removeAlias(String alias);
  1. 判断给定的名字是否已被定义为别名
boolean isAlias(String name);
  1. 获取指定名称的所有别名
String[] getAliases(String name);

SimpleAliasRegistry接口

SimpleAliasRegistry类实现AliasRegistry接口,作用是实现对别名的注册、删除等基本功能,扩展解析别名等功能。
所属包:org.springframework.core

成员变量

  1. 定义日志
protected final Log logger = LogFactory.getLog(getClass());
  1. 定义别名 → \rightarrow 规范名的映射Map
private final Map<String,String> aliasMap = new ConcurrentHashMap<>(16);

说明:key为别名是由于实现方法的参数均为别名,便于处理;ConcurrentHashMap初始容量为16.

注册别名(registerAlias)

在这里插入图片描述
其中,允许别名覆盖方法为allowAliasOverriding,默认为允许覆盖。

protected boolean allowAliasOverriding(){
	return true;
}

检查循环引用(checkForAliasCircle)

  1. 该方法入参为name和alias,判断是否递归存在name为alias别名的情况,调用hasAlias方法。
  2. 存在循环引用则抛出IllegalStateException异常

检查指定名称是否已注册指定别名(hasAlias)

	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();
				if (registeredAlias.equals(alias) || hasAlias(registeredAlias, alias)) {	//递归调用
					return true;
				}
			}
		}
		return false;
	}

该方法检查指定名称是否已注册指定别名,包括循环引用的情况。
如"panda" ← \leftarrow “熊猫”,“熊猫” ← \leftarrow “国宝”。

获取别名列表(getAliases&retrieveAliases)

根据指定名称(aliasMap的value)递归获取别名(aliasMap的key)并添加到别名列表,其中getAliases需要锁aliasMap执行retrieveAliases。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值