抢占先机
VMware 提供培训和认证,以加速您的进步。
了解更多如果您关注了 10 月份的 Spring 2.0 发布,您就会知道其中一个重要的新特性是 XML 扩展命名空间:定义新的 XML 元素和属性以生成 Spring 元数据,并且可以与常规 bean 定义一起使用。 这提供了一个有价值的新扩展点,并使 Spring 配置对于许多重复性任务来说使用起来更简单、更强大。
然而,还有一小块语法糖您可能没有注意到——可能是因为 Spring 团队中没有人来告诉您……我已经答应自己一段时间要做一篇以代码为中心的博客,现在就开始吧。
迁移到 XML 模式以允许扩展命名空间也允许一个小捷径,使用属性而不是子元素来表示属性值。 这些属性未经过验证,但由于我们使用的是 XML 模式而不是 DTD,我们仍然可以保留所有其他验证。 由于属性名称是属性名称,因此 XML 验证无论如何都不会添加任何内容; 这是一个基于 Java 的验证问题,而不是 XML 结构问题。 想象一下以下 Java 对象,具有两个简单的属性和一个对关联对象的依赖
public class Person {
private int age;
private String name;
private House house;
public void setAge(int age) {
this.age = age;
}
public void setName(String name) {
this.name = name;
}
public void setHouse(House house) {
this.house = house;
}
}
这可以在 Spring 2.0 中使用 XML 进行配置,如下所示
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean class="com.interface21.spring2.ioc.Person"
p:name="Tony"
p:age="53"
p:house-ref="number10"
/>
<bean class="com.interface21.spring2.ioc.House"
id="number10"
p:name="10 Downing Street"
/>
</beans>
请注意,如何使用属性而不是元素来提供属性。 这是通过特殊命名空间“p”的神奇之处实现的。 这是一个未经验证的特殊命名空间,但旨在允许使用与 Java 属性名称匹配的名称的属性。
对于简单类型,我们只需在“p”命名空间中使用属性名称,如“p:name”。 当注入对其他 Spring bean 的引用时,请使用“-ref”后缀,如“p:house-ref”。
当您想要使用自动装配时,此快捷方式语法特别引人注目。 例如,考虑以下变体
<bean class="com.interface21.spring2.ioc.Person"
autowire="byType"
p:name="Tony"
p:age="53"
/>
这里我们没有设置“house”属性,因为自动装配可以处理它。 您甚至可以在 <beans> 元素级别使用 default-autowire,以在整个文件中进行自动装配。
以下来自 Spring 1.0 或 1.1 用法的代码片段说明了在最近的两个主要版本(1.2 和 2.0)中 Spring 配置如何减少了最小数量的尖括号
<bean class="com.interface21.spring2.ioc.Person">
<property name="name"><value>"Tony"</value></property>
<property name="age"><value>"53"</value></property>
<property name="house"><ref local=”number10” /></property>
</bean>
在 Spring 1.2 中,我们引入了“value”和“ref”属性,而不是在大多数情况下需要 <property> 的子元素,而在 Spring 2.0 中,现在可以使用纯粹的属性。
当然,传统的语法仍然有效——Spring 2.0 只是添加了额外的选项。 当属性值复杂且作为属性值不合法或不可读时,请使用传统的长手形式。 而且,当然,无需重写现有的配置文件,因为 Spring 2.0 总体上是完全向后兼容的。
当将配置示例放入演示文稿中时,新语法特别好。 这提醒我,我今天的真正工作是完成我在 Spring Experience 的幻灯片……希望在那里见到你!