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 社群中所有即將舉行的活動。

檢視全部