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文件,具体的加载内容,我们下篇文章继续讲解。