spring的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:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
...<!--中間xml文件部分-->.....
</beans>
一直在復制黏貼,但是不知道作用是什么,不理解的話常出錯。。。
xmlns和命名空間
首先,介紹一下xmlns的作用,如下所示,一個 xml 文檔中如果包含如下兩種定義不同, 但是名稱相同的元素, xml 解析器是無法解析的, 因為它不能確定當你調用document.getElementsByTagName("book") 時應該返回哪個元素。
<!-- 這里的 table 元素描述的是一個表格-->
<table>
<tr>
<td>Apples</td>
<td>Bananas</td>
</tr>
</table>
<!-- 這里的 table 元素描述的是一個家居桌子-->
<table>
<name>African Coffee Table</name>
<width>80</width>
<length>120</length>
</table>
這時候可以通過在名稱增加前綴解決這個問題
<!-- 這里的 table 元素描述的是一個表格-->
<h:table> <!--添加了前綴 h -->
<h:tr>
<h:td>Apples</h:td>
<h:td>Bananas</h:td>
</h:tr>
</h:table>
<!-- 這里的 table 元素描述的是一個表格-->
<f:table> <!--添加了前綴 f -->
<f:name>African Coffee Table</f:name>
<f:width>80</f:width>
<f:length>120</f:length>
</f:table>
由此,引入一個概念 命名空間,通過增加前綴表示不同的那是不同命名空間下的table,從而解決了矛盾,但是不同的人都有自己創建的不同的命名空間來描述同樣的東西,不利於xml文件信息的解析,比如說,同樣都是水果,可以從顏色和香味不同角度來定義成如下兩種形式:
<!--按照水果香味來定義-->
<perfume:fruit>
<name>....</name>
<perfume>.....</perfume>
</perfume:fruit>
<!--按照水果顏色來定義-->
<color:fruit>
<name>....</name>
<color>....</color>
</color:fruit>
為此,w3c(萬維網聯盟)對於一些類型,定義了對應的命名空間和這些類型的標准,xml解釋器碰到這些類型的時候就會通過這些標准去解析這類型的標簽,為了確保命名空間的唯一,所以不同的命名空間的通常使用URL作為被識別的id,如下例子:
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
這句話的作用是當前引入了一個叫做xsi的命名空間,xsi可以在接下來要使用該命名空間時所使用的,如下:
<xsi:schemaLocation="...... ......">
而http://www.w3.org/2001/XMLSchema-instance這個很長的字符串,則是xsi這個名稱空間被xml解釋器內部所識別的時候所真正使用的id,但也本身只是被當做一個字符串名字去處理,xml解釋器根據這個id去獲取它對應的標准,從而知道這個命名空間定義有什么樣的標簽(xml解釋器自帶有一些通用的命名空間的標准),這個字符串雖然看起來是URL,但是和對應的網頁上的信息沒有關系,只是用來提供命名空間唯一性的作用,網址有時可以被打開,上面會有關於該命名空間的信息。
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
所以,spring配置文件中這三句話分別表示,引入了三個命名空間。
其中第一個xmlns后面沒有空間名的,表示引入了一個默認的名稱空間,下文中不使用命名空間前綴的都默認使用這個命名空間,這個默認的命名空間,其真正的id是"http://www.springframework.org/schema/beans"。
引入的第二個命名空間叫做xsi,其真正的id是"http://www.w3.org/2001/XMLSchema-instance"
引入的第三個命名空間叫做context,其真正的id是"http://www.springframework.org/schema/context"
xsi:schemaLocation
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd"
在最后可以看到xsi:schemaLocation,這句話的意思表示使用命名空間xsi下的schemaLocatioin,設置了它對應的值為后面很多很多的URL,schemaLocation中存儲的值每兩個為一組,第一個代表命名空間,第二個代表該命名空間的標准的文件位置,如下所示,這句話就是說明命名空間http://www.springframework.org/schema/beans的標准文件是http://www.springframework.org/schema/beans/spring-beans-3.0.xsd*
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
因為xml解釋器不一定含有所有命名空間的標准,通過這樣設置就可以告訴xml解釋器不同命名空間的對應的標准是什么了,而這也是xsi這個命名空間的作用,要用到其schemaLocation。
最后,對應一般的xml解釋器的工作流程中,xml解釋器識別到有“http://www.w3.org/2001/XMLSchema-instance"這個通用的名稱空間后,明白知道要引入一些不同命名空間,就會從其schemaLocation中獲取不同命名空間和其對應的標准。