Spring源码分析SimpleAliasRegistry类
AliasRegistry接口
声明对别名的注册、删除等基本方法。
所属包:org.springframework.core
声明方法
- 为一个规范名称(canonical name)注册一个别名,如果别名已存在,抛出
IllegalStateException
异常
void registerAlias(String name, String alias);
- 删除指定别名,如果没有指定的别名存在,抛出
IllegalStateException
异常
void removeAlias(String alias);
- 判断给定的名字是否已被定义为别名
boolean isAlias(String name);
- 获取指定名称的所有别名
String[] getAliases(String name);
SimpleAliasRegistry接口
SimpleAliasRegistry类实现AliasRegistry接口,作用是实现对别名的注册、删除等基本功能,扩展解析别名等功能。
所属包:org.springframework.core
成员变量
- 定义日志
protected final Log logger = LogFactory.getLog(getClass());
- 定义别名 → \rightarrow →规范名的映射Map
private final Map<String,String> aliasMap = new ConcurrentHashMap<>(16);
说明:key为别名是由于实现方法的参数均为别名,便于处理;ConcurrentHashMap初始容量为16.
注册别名(registerAlias)
其中,允许别名覆盖方法为allowAliasOverriding,默认为允许覆盖。
protected boolean allowAliasOverriding(){
return true;
}
检查循环引用(checkForAliasCircle)
- 该方法入参为name和alias,判断是否递归存在name为alias别名的情况,调用hasAlias方法。
- 存在循环引用则抛出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。