2.1.2Spring源码解析——alias标签的解析

 在对bean进行定义的时候,除了使用id属性来指定名称之外,为了提供多个名称,可以使用alias标签来指定。
 在定义bean的时候就指定所有的别名并不总是恰当的。有时候我们可能在当前位置为别处定义的bean引入别名。在XML配置文件中,可以单独使用<alias/>元素来完成bean别名的定义。比如

<bean id="testBean" class="com.test/>

 要给这个bean加别名,以方便不同对象的调用。可以直接使用bean标签中的name属性:

<bean id="testBean"  name="testBean,testBean2"  class=“com.test"/>

同样,Spring还有另外一种声明别名的方式

<bean id="testBean"  class="com.test"/>
<alias name="testBean" alias="testBean,testBean2"/>

 举个例子;如果组件A在XML配置文件中定义了一个名字为componentA的DataSource类型的bean,但是组件B却想在其XML文件中componentB命名来引用这个bean。而在主程序MyApp的XML配置文件中想用myApp的名字来引用。在这个情形下我们就可以用alias元素来实现

<alias name="componentA" alias="componentB"/>
<allas name="componentA" alias="myApp"/>

 这样一来,每个组件以及主程序都可以通过唯一的名字来引用同一个数据源。

protected void processAliasRegistration(Element ele) {
            //todo.获取beanName
            String name = ele-getAttribute(NAME_ATTRIBUTE);
            //todo.获aLias
            String alias = ele-getAttribute(ALIAS_ATTRIBUTE);boolean valid. = true;
          if (!Stringutils.hasText(name)) {
                        getReaderContext().error( message: "Name must. not be. empty", ele);
                    valid=. false;
          }
          if (!Stringutils.hasText(alias)).{
                      getReaderContext().error( message: "Alias must. not be. empty", ele);valid.=. false;
          }
        if (valid){
          try{
                    //todo.注册aLias
                    getReaderContext().getRegistry().registerAlias(name, alias);
                }
            catch (Exception ex). {
                getReaderContext().error( message: "Failed to register alias.'".+.alias +
                "'for bean with name. '"+ name+. "'", ele, ex);

                //todo注册别之后通知监所器 相应的处理
                getReaderContext().fireAliasRegistered(name, alias, extractSource(ele));
            }
}

 可以看出bean和alias解析大同小异,都是将别名与beanName组成一队注册到register中。
 AliasRegistry.java(接口)--->SimpleAliasRegistry.java(实现)

    /** Map from alias to canonical name */
    private final Map<String, String> aliasMap = new ConcurrentHashMap<String, String>(16);

    public void registerAlias(String name, String alias) {
        Assert.hasText(name, "'name' must not be empty");
        Assert.hasText(alias, "'alias' must not be empty");
        //todo 如果beanName与alias相同的话不记录alias,并删除对应的alias
        if (alias.equals(name)) {
            this.aliasMap.remove(alias);
        }
        else {
            //todo 如果alias不允许被覆盖则抛出异常
            if (!allowAliasOverriding()) {
                String registeredName = this.aliasMap.get(alias);
                if (registeredName != null && !registeredName.equals(name)) {
                    throw new IllegalStateException("Cannot register alias '" + alias + "' for name '" +
                            name + "': It is already registered for name '" + registeredName + "'.");
                }
            }
            //todo 当A->B存在时,若再次出现A->B->C时候则会抛出异常
            checkForAliasCircle(name, alias);
            this.aliasMap.put(alias, name);
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值