Spring的核心功能之一就是IOC,也就是一個容器管理功能,那麼我們怎麼將我們定義的bean注入的Spring容器中,spring中,提供了xml文檔,我們將我們的bean定義在xml中,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"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="myTestBean" class="com.study.MyTestBean">
</bean>
</beans>
今天我們先不看bean,而是關注在爲什麼我們的xml中的頭文件,爲什麼要怎麼定義,它到底有何作用。
一、DTD和XSD
DTD(Document Type Definition):文檔類型定義,是一種xml約束模式語言,是xml文件驗證機制,屬於xml文件組成的一部分。簡單說,DTD可以幫助我們驗證我們的xml是否是按照要求來寫的。
一個DTD文檔包含:元素的定義規則,元素間關係的定義規則,元素可使用的屬性,可使用的實體或符號規則。在主要在mapper的生命中使用這中格式,格式如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
XSD(XML Schemas Definition):和DTD類似,描述了xml文檔的結構,可以用來驗證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"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd>
其主要包含名稱空間及(xmlns="http://www.springframework.org/schema/beans");還包括對應的xsd所存儲的位置信息,其中位置信息包含兩部分,一是名稱空間的URI,另一部分就是該名稱空間所標識的文件位置或URL地址(xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd).
二、spring源碼導讀。
從上面的描述我們知道不管是DTD,還是XSD其實最主要的功能就是幫助我們驗證XML文件的正確性,下面讓我們跟進源碼去看一下,是如何幫助我們驗證的,以XSD爲例:
示例代碼如下:
public static void main(String[] args) {
XmlBeanFactory bf = new XmlBeanFactory(new ClassPathResource("beanFactory.xml"));
MyTestBean bean = (MyTestBean)bf.getBean("myTestBean");
System.out.println(bean.getTestStr());
}
其中getValidationModeForResource這個方法就是驗證我們的xml文件是否是符合書寫要求的,進入方法可以看到:
這裏主要是判斷是手動驗證還是自動驗證,因爲我們這裏並沒有進行手動設置所以是走到了自動驗證邏輯中,再次進入自動驗證的代碼,如下:
這裏主要就是驗證我們的xml是DTD,還是XSD,DTD返回2,XSD返回3,那麼spring中是怎麼進行判斷的其實就是根據hasDocType這個方法,來判斷的,主要xml文件中包含DOCTYPE,就是DTD格式,不包含就是XSD
所以spring就會根據我們定義的xml文件類型,來加載對應的xml文件,具體的加載內容,我們下篇文章繼續講解。