Spring 2.0 中的 XML 语法糖

工程 | Rod Johnson | 2006 年 11 月 26 日 | ...

如果您关注了 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=&rdquo;number10&rdquo; /></property>
</bean>

在 Spring 1.2 中,我们引入了“value”和“ref”属性,而不是在大多数情况下需要 <property> 的子元素,而在 Spring 2.0 中,现在可以使用纯粹的属性。

当然,传统的语法仍然有效——Spring 2.0 只是添加了额外的选项。 当属性值复杂且作为属性值不合法或不可读时,请使用传统的长手形式。 而且,当然,无需重写现有的配置文件,因为 Spring 2.0 总体上是完全向后兼容的。

当将配置示例放入演示文稿中时,新语法特别好。 这提醒我,我今天的真正工作是完成我在 Spring Experience 的幻灯片……希望在那里见到你!

获取 Spring 新闻简报

随时关注 Spring 新闻简报

订阅

抢占先机

VMware 提供培训和认证,以加速您的进步。

了解更多

获取支持

Tanzu Spring 在一个简单的订阅中提供 OpenJDK™、Spring 和 Apache Tomcat® 的支持和二进制文件。

了解更多

即将举行的活动

查看 Spring 社区中所有即将举行的活动。

查看全部