返回介绍

3.2 alias 标签的解析

发布于 2025-04-22 22:09:08 字数 2347 浏览 0 评论 0 收藏

通过上面较长的篇幅我们终于分析完了默认标签中对 bean 标签的处理,那么我们之前提到过,对配置文件的解析包括对 import 标签、alias 标签、bean 标签、beans 标签的处理,现在我们已经完成了最重要也是最核心的功能,其他的解析步骤也都是围绕第 3 个解析而进行的。在分析了第 3 个解析步骤后,再回过头来看看对 alias 标签的解析。

在对 bean 进行定义时,除了使用 id 属性来指定名称之外,为了提供多个名称,可以使用 alias 标签来指定。而所有的这些名称都指向同一个 bean,在某些情况下提供别名非常有用,比如为了让应用的每一个组件能更容易地对公共组件进行引用。

然而,在定义 bean 时就指定所有的别名并不是总是恰当的。有时我们期望能在当前位置为那些在别处定义的 bean 引入别名。在 XML 配置文件中,可用单独的<alias/>元素来完成 bean 别名的定义。如配置文件中定义了一个 JavaBean:

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

要给这个 JavaBean 增加别名,以方便不同对象来调用。我们就可以直接使用 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 的名字来引用此 bean。最后容器加载 3 个 XML 文件来生成最终的 ApplicationContext。在此情形下,可通过在配置文件中添加下列 alias 元素来实现:

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

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

这样一来,每个组件及主程序就可通过唯一名字来引用同一个数据源而互不干扰。

在之前的章节已经讲过了对于 bean 中 name 元素的解析,那么我们现在再来深入分析下对于 alias 标签的解析过程。

protected void processAliasRegistration(Element ele) {

 //获取 beanName

  String name = ele.getAttribute(NAME_ATTRIBUTE);

 //获取 alias

  String alias = ele.getAttribute(ALIAS_ATTRIBUTE);

  boolean valid = true;

  if (!StringUtils.hasText(name)) {

   getReaderContext().error("Name must not be empty", ele);

   valid = false;

 }

  if (!StringUtils.hasText(alias)) {

   getReaderContext().error("Alias must not be empty", ele);

   valid = false;

 }

  if (valid) {

   try {

   //注册 alias

    getReaderContext().getRegistry().registerAlias(name, alias);

  }

   catch (Exception ex) {

    getReaderContext().error("Failed to register alias '" + alias +

    "' for bean with name '" + name + "'", ele, ex);

  }

  //别名注册后通知监听器做相应处理

   getReaderContext().fireAliasRegistered(name, alias, extractSource(ele));

 }

}

可以发现,跟之前讲过的 bean 中的 alias 解析大同小异,都是将别名与 beanName 组成一对注册至 registry 中。这里不再赘述。

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。