戴着假发的程序员出品 抖音ID:戴着假发的程序员欢迎关注
AliasRegistry接口
spring应用手册(第五部分)
AliasRegistry接口主要是对springBean的别名进行管理的顶级接口,主要是对别名的增删功能。
看看源码:
public interface AliasRegistry {
//对指定的名称注册别名
void registerAlias(String var1, String var2);
//从当前容器中移除别名
void removeAlias(String var1);
//在当前容器中是否存在该别名
boolean isAlias(String var1);
//返回指定名称的所有别名
String[] getAliases(String var1);
}
它有几个比较重要的子接口或者实现类:
BeanDefinitionRegistry接口(继承AliasRegistry接口),扩展了对BeanDefinition注册操作的功能:
public interface BeanDefinitionRegistry extends AliasRegistry {
//注册BeanDefinition到注册表
void registerBeanDefinition(String beanName, BeanDefinition beanDefinition)
throws BeanDefinitionStoreException;
//移除注册表中beanName的BeanDefinition
void removeBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;
//获取注册表中beanName的BeanDefinition
BeanDefinition getBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;
///检查此注册表是否包含具有给定名称的BeanDefinition。
boolean containsBeanDefinition(String beanName);
//返回此注册表中定义的所有bean的名称。
String[] getBeanDefinitionNames();
//返回注册表中定义的bean的数目
int getBeanDefinitionCount();
//确定给定bean名称是否已在该注册表中使用
boolean isBeanNameInUse(String beanName);
}
SimpleAliasRegistry类(实现AliasRegistry接口),这个类是AliasRegistry接口的默认实现,内部使用ConcurrentHashMap作为内存注册表,存储name-alias的映射关系:
public class SimpleAliasRegistry implements AliasRegistry {
/** 用于子类的log */
protected final Log logger = LogFactory.getLog(getClass());
/** 存储name-alias的Map */
private final Map<String, String> aliasMap = new ConcurrentHashMap<>(16);
/** 具体的注册别名实现方法 */
@Override
public void registerAlias(String name, String alias) {
//....
}
// 是否允许重写注册表别名信息,默认true
protected boolean allowAliasOverriding() {
return true;
}
//校验给定的name-alias映射是否已在注册表aliasMap中
public boolean hasAlias(String name, String alias) {
//....
return false;
}
//移除相应别名
@Override
public void removeAlias(String alias) {
//.....
}
//给定参数是否是别名
@Override
public boolean isAlias(String name) {
return this.aliasMap.containsKey(name);
}
//在注册表获取给定规范名称的所有别名信息
@Override
public String[] getAliases(String name) {
//....
return StringUtils.toStringArray(result);
}
//给定名字检索所有的别名
private void retrieveAliases(String name, List<String> result) {
//....
}
//校验给定的名称是否指向别名,不指向异常抛出
protected void checkForAliasCircle(String name, String alias) {
//......
}
//根据给定的别名获取规范名称
public String canonicalName(String name) {
//.....
return canonicalName;
}
}
SimpleBeanDefinitionRegistry(继承SimpleAliasRegistry),因为该类继承与SimpleAliasRegistry。所以它维护aliasMap别名注册表,又因为该类实现了BeanDefinitionRegistry接口,所有同时它也维护beanDefinitionMap即bean描述注册表
public class SimpleBeanDefinitionRegistry extends SimpleAliasRegistry implements BeanDefinitionRegistry {
// name-BeanDefinition 映射关系表,ConcurrentHashMap实现的内存注册表,用于存储BeanDefinition
private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<>(64);
//注册表中注册 name-BeanDefinition
@Override
public void registerBeanDefinition(String beanName, BeanDefinition beanDefinition)
throws BeanDefinitionStoreException {
this.beanDefinitionMap.put(beanName, beanDefinition);
}
//移除注册表中的name-BeanDefinition
@Override
public void removeBeanDefinition(String beanName) throws NoSuchBeanDefinitionException {
if (this.beanDefinitionMap.remove(beanName) == null) {
throw new NoSuchBeanDefinitionException(beanName);
}
}
//获取注册表中的name-BeanDefinition
@Override
public BeanDefinition getBeanDefinition(String beanName) throws NoSuchBeanDefinitionException {
BeanDefinition bd = this.beanDefinitionMap.get(beanName);
if (bd == null) {
throw new NoSuchBeanDefinitionException(beanName);
}
return bd;
}
//判断注册表中是否包含beanName的key
@Override
public boolean containsBeanDefinition(String beanName) {
return this.beanDefinitionMap.containsKey(beanName);
}
//获取注册表beanDefinetionName集合
@Override
public String[] getBeanDefinitionNames() {
return StringUtils.toStringArray(this.beanDefinitionMap.keySet());
}
//获取注册表大小
@Override
public int getBeanDefinitionCount() {
return this.beanDefinitionMap.size();
}
//判断beanName是否被使用,在BeanDefinition注册表中获取别名注册表中
@Override
public boolean isBeanNameInUse(String beanName) {
return isAlias(beanName) || containsBeanDefinition(beanName);
}
}