Spring 2.0 的 XML 語法糖

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

如果您有關注 10 月份 Spring 2.0 的發布,您會知道其中一個重要的新功能是 XML 擴展命名空間:定義新的 XML 元素和屬性,以產生 Spring 元數據,並且可以與常規 bean 定義一起使用。這提供了一個有價值的新擴展點,並使 Spring 配置對於許多重複性任務來說,使用起來更簡單且更強大。

然而,還有一個小小的語法糖,您可能沒有注意到--可能是因為 Spring 團隊中沒有人來告訴您... 因為我已經答應自己好一陣子要做一篇以程式碼為中心的部落格了,所以這就開始了。

轉向 XML Schema 以允許擴展命名空間也允許一個小小的捷徑,使用屬性而不是子元素來表示屬性值。 這些屬性不會被驗證,但因為我們使用的是 XML Schema 而不是 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 社群中所有即將舉行的活動。

查看全部