Spring应用手册-AliasRegistry接口

戴着假发的程序员出品 抖音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);
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

戴着假发的程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值