- 前言
- 第一部分 核心实现
- 第 1 章 Spring 整体架构和环境搭建
- 第 2 章 容器的基本实现
- 第 3 章 默认标签的解析
- 第 4 章 自定义标签的解析
- 第 5 章 bean 的加载
- 第 6 章 容器的功能扩展
- 第 7 章 AOP
- 第二部分 企业应用
- 第 8 章 数据库连接 JDBC
- 第 9 章 整合 MyBatis
- 第 10 章 事务
- 第 11 章 SpringMVC
- 第 12 章 远程服务
- 第 13 章 Spring 消息
3.2 alias 标签的解析
通过上面较长的篇幅我们终于分析完了默认标签中对 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 中。这里不再赘述。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论