Spring源码学习:AliasRegistry(Bean别名注册)

一、基本信息

AliasRegistry接口用于管理Bean的别名信息(一个Bean可以对应多个别名),位于spring-core模块中,首次发布是在spring2.5.2版本,直接实现类是SimpleAliasRegistry。


二、方法


1.void registerAlias(String name, String alias)

给Bean注册别名,方法实现:由于Bean的注册是多线程的,该方法的实现逻辑用synchronized关键字包裹,采用ConcurrentHashMap缓存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");
        //ConcurrentHashMap只能保证单个put、remove方法的原子性。而不能保证多个操作同时的原子性。比如一个线程添加、一个线程删除  显然这是不被允许的,因此需要对注册逻辑加锁
		synchronized (this.aliasMap) {
            //当Bean名称和别名相同时,此时别名将失去意义,于是把这个映射关系移除
			if (alias.equals(name)) {
				this.aliasMap.remove(alias);
				if (logger.isDebugEnabled()) {
					logger.debug("Alias definition '" + alias + "' ignored since it points to same name");
				}
			}
			else {
				String registeredName = this.aliasMap.get(alias);
                //判断当前别名是否已注册
				if (registeredName != null) {
                    //已注册且和当前Bean的名称相同,直接返回
					if (registeredName.equals(name)) {
						// An existing alias - no need to re-register
						return;
					}
                    //若该别名映射了Bean且不允许覆写此别名(让其指向别的Bean),直接报错
					if (!allowAliasOverriding()) {
						throw new IllegalStateException("Cannot define alias '" + alias + "' for name '" +
								name + "': It is already registered for name '" + registeredName + "'.");
					}
					if (logger.isDebugEnabled()) {
						logger.debug("Overriding alias '" + alias + "' definition for registered name '" +
								registeredName + "' with new target name '" + name + "'");
					}
				}
                //检查别名循环引用的情况,如注册了(A->B),后面再注册(B->A)的时候就会报错
				checkForAliasCircle(name, alias);
                //别名注册
				this.aliasMap.put(alias, name);
				if (logger.isTraceEnabled()) {
					logger.trace("Alias definition '" + alias + "' registered for name '" + name + "'");
				}
			}
		}
	}

2.void removeAlias(String alias)

从Bean别名注册表中移除给定的别名映射关系,方法实现:

    @Override
	public void removeAlias(String alias) {
		synchronized (this.aliasMap) {
			String name = this.aliasMap.remove(alias);
			if (name == null) {
				throw new IllegalStateException("No alias '" + alias + "' registered");
			}
		}
	}

3.boolean isAlias(String name)

判断指定的Bean的name是否已作为别名

4.String[] getAliases(String name)

获取指定的Bean的所有别名,具体逻辑:遍历别名注册表获取所有alias

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值