Spring 2.0 中的 XML 語法糖

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

如果你關注了十月份的 Spring 2.0 釋出,你就會知道其中一個重要的新功能是 XML 擴充套件名稱空間:能夠定義新的 XML 元素和屬性,這些元素和屬性可以生成 Spring 元資料,並可以與常規 bean 定義一起使用。這提供了一個有價值的新擴充套件點,使得 Spring 配置對於許多重複性任務來說更易於使用,並且功能更強大。

然而,還有一個你可能沒注意到的炫酷小語法糖——大概是因為 Spring 團隊沒人告訴你……我早就承諾要寫一篇以程式碼為中心的部落格了,現在就開始。

遷移到 XML Schema 以支援擴充套件名稱空間也允許了一個小捷徑,可以使用屬性而不是子元素來表示屬性值。這些屬性不會被驗證,但由於我們使用的是 XML Schema 而不是 DTD,所以我們仍然可以保留所有其他驗證。由於屬性名就是屬性名,XML 驗證 anyway 也不會增加任何東西;這是一個基於 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”屬性,因為自動裝配可以處理它。你甚至可以在 `` 元素級別使用 `default-autowire` 來對整個檔案進行自動裝配。

以下來自 Spring 1.0 或 1.1 用法的片段說明了 Spring 配置在最近兩次主要版本(1.2 和 2.0)中如何大大減少了最小的尖括號數量


<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”屬性,在大多數情況下取代了 `` 的子元素,而在 Spring 2.0 中,現在可以完全使用屬性了。

當然,傳統的語法仍然有效——Spring 2.0 只是增加了額外的選項。當屬性值複雜且不適合或不適合作為屬性值時,請使用傳統的長格式。當然,沒有必要重寫現有的配置檔案,因為 Spring 2.0 總體上完全向後相容。

新的語法在將配置示例放入簡報時尤其好用。這讓我想起我今天真正的任務是完成我的 Spring Experience 的幻燈片……希望在那裡見到你!

獲取 Spring 新聞通訊

透過 Spring 新聞通訊保持聯絡

訂閱

領先一步

VMware 提供培訓和認證,助您加速進步。

瞭解更多

獲得支援

Tanzu Spring 提供 OpenJDK™、Spring 和 Apache Tomcat® 的支援和二進位制檔案,只需一份簡單的訂閱。

瞭解更多

即將舉行的活動

檢視 Spring 社群所有即將舉行的活動。

檢視所有