目錄
1.老版本applicationContext.xml中的dtd限制檔案
2.新版本applicationContext.xml中的xsd限制檔案
2.1 什麼是XML命名空間
2.2 XML命名空間的聲明與使用
2.3 Spring配置檔案配置命名空間
3.總結
在Spring的核心配置檔案applicationContext.xml中我們總能看到如下圖這樣的配置:

紅框裡的部分的作用究竟是什麼呢?想了解這個問題我們先看一下老版本的applicationContext.xml配置檔案:
第一行表示xml聲明,任何格式良好的xml文檔第一行都必須是聲明,相當于告訴解析器此文檔是xml文檔,請用xml解析器進行解析。下面的dtd檔案又是什麼呢?通過dtd檔案上面的注釋我們可以了解到如下資訊:
定義了一種簡單而一緻的方法用于建立不同命名空間下的JavaBeans對象,由SpringBeanFactory管理,由XmlBeanDefinitionReader讀取。
大多數Spring功能都使用這種文檔類型,包括基于bean工廠的web應用程式上下文。
本文檔中的每個“bean”元素定義一個JavaBean。典型的bean類與JavaBean屬性和/或構造函數參數一起被指定。
bean執行個體可以是“單例”或“多例”。
還支援清單、集合、地圖和java.util.Properties屬性作為bean屬性類型或構造函數參數類型。
總結下為,applicationContext.xml的作用:為Spring上下文程式建構各元件基礎啟動類,比如HikariCP的HikariDataSource(資料連接配接池)或MyBatis的SqlSessionFactory(事務工廠)。而dtd檔案的作用為:表示該xml裡的元素和屬性等需符合spring-beans-2.0.dtd文檔類型定義标準,說白了就是告訴xml解析器按照什麼樣的規則去解析此xml檔案
最上面xml代碼中有的元素沒有使用任何字首,因為它們的預設命名空間是 "http://www.springframework.org/schema/beans", 該命名空間所對應的schema的位址:http://www.springframework.org/schema/beans/spring-beans-4.0.xsd ,這段代碼還有另外一個以aop為字首的命名空間"http://www.springframework.org/schema/aop", 該命名空間對應的schema位址:http://www.springframework.org/schema/aop/spring-aop-4.0.xsd,<aop:scoped-proxy/> 這段代碼就使用了以aop為字首的scoped-proxy元素。其他元素包括beans,bean,property,map等元素都是通過schema來定義的。
XML命名空間是由國際化資源辨別符 (IRI) 辨別的 XML 元素和屬性集合,該集合通常稱作 XML"詞彙"。在XML中,元素名稱是由開發者定義的,當兩個不同的文檔使用相同的元素名時,就會發生命名沖突。舉個簡單的栗子,命名空間很像 Java 中的包,不同的包下面可以存放相同的類名,隻要在引入類時前面加上類的包就可以避免同名類的沖突。
命名空間被聲明為元素的屬性。并不一定隻在根元素聲明命名空間,而是可以在 XML 文檔中的任何元素中進行聲明。聲明的命名空間的範圍起始于聲明該命名空間的元素,并應用于該元素的所有内容,直到被具有相同字首名稱的其他命名空間聲明覆寫,其中元素内容是指該元素的 <opening-tag> 和 </closing-tag> 之間的内容。
xmlns:類似于一個保留字,它隻用于聲明命名空間。換言之xmlns用于綁定命名空間,但其本身并不綁定到任何命名空間。
aop:這裡實際上是将字首"aop"與命名空間"http://www.springframework.org/schema/aop"(此URI包含關于命名空間的資訊)綁定在一起。通常我們會用一個比較簡短或約定俗成的名字來作為命名空間的字首(例如這裡的aop),但具體使用什麼字首完全取決于個人。使用有意義的命名空間字首增強了XML檔的清晰性,是以可以看到我們平時在配置Spring配置檔案的時候,字首名都是aop(切面)、tx(事務)等命名方式。配置了字首後,我們使用命名空間字首如下:
這裡我們在配置面向切面程式設計的内容時,使用aop字首,代表後面的元素(config,advisor等)都是在http://www.springframework.org/schema/aop中定義的。請注意,字首隻用作占位符,并且必須通過可以識别命名空間的 XML 分析器進行解釋才能使用綁定到該字首的實際命名空間。
單個預設命名空間
我們看到,在配置檔案中,beans,bean等元素我們是沒有使用命名空間字首的。重複限定一個要在命名空間中使用的元素或屬性可能會非常麻煩。這種情況下,可以聲明一個預設命名空間。無論在任何時候都隻能存在一個預設命名空間。聲明一個預設命名空間意味着如果預設命名空間聲明範圍内的任何元素未使用字首顯式限定,則該元素将被隐式限定。與帶字首的命名空間一樣,預設命名空間 也可以被覆寫。預設命名空間聲明方式如下:
Spring 提供了對各種工具的xml scheme的配置方式。Spring在啟動時會檢驗XML檔案,如果xml空間存在命名空間内沒有的元素會報錯。通常情況下,命名空間對應的URI是一個存放XSD的位址,盡管規範沒有這麼要求。如果沒有提供schemaLocation,那麼Spring的XML解析器會從命名空間的URI裡加載XSD檔案。例如我們可以這樣寫:
則預設的命名空間就是加載指定的xsd檔案。schemaLocation提供了一個xml 命名空間到對應的XSD(Xml Schema Definition)檔案的一個映射,它的值由一個或多個URI引用對組成,兩個URI之間以空白符分隔(空格和換行均可)。第一個URI是定義的 XML命名空間的值,第二個URI給出Schema文檔的實際位置,Schema處理器将從這個位置讀取Schema文檔,該文檔的targetNamespace必須與第一個URI(XML命名空間的值)相比對。在xsi:schemaLocation後面配置的字元串都是成對的,前面的是命名空間的URI,後面是xsd檔案的URI:
這裡命名空間aop的值是"http://www.springframework.org/schema/aop",它對應的xsd檔案的位置為"http://www.springframework.org/schema/aop/spring-aop-3.0.xsd"。我們打開http://www.springframework.org/schema/aop/spring-aop-3.0.xsd,可以看到xsd檔案中targetNamespace的值和命名空間的值一樣。如下:
引入XML Schema命名空間是為了避免命名沖突,就像Java中的package一樣,将不同作用的标簽分門别類,比如Spring中的tx命名空間針對事務類的标簽,context命名空間針對元件的标簽。