通过第2章的介绍,应该知道Spring如何从XML一步步解析成BD对象并注册到容器中,这一过程有个概要认识了。
接下来开始详细分析与XML相关的那些事。
一、首先看一下使用的XML文档。
<?xmlversion="1.0"encoding="UTF-8"?> <beansxmlns="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-3.1.xsd"> <beanid="beijingCard"class="com.spring.examples.ioc.bean.Card" > <propertyname="cardNo"value="6220-52103-4123-456"></property> <propertyname="bank"value="北京银行"/> </bean> <beanid="jiansheCard"class="com.spring.examples.ioc.bean.Card"> <propertyname="cardNo"value="6227-52103-4123-456"></property> <propertyname="bank"value="建设银行"/> </bean> <beanid="miyue" class="com.spring.examples.ioc.bean.User"primary="true" scope="singleton"> <propertyname="userName"value="芈月"></property> <propertyname="email"value="[email protected]"></property> <propertyname="cardList"> <list> <refbean="beijingCard"/> <refbean="jiansheCard"/> </list> </property> </bean> </beans>
简单介绍一下XML相关的概念。
XML 指可扩展标记语言.
第一行是 XML 声明。它定义 XML 的版本 (1.0) 和所使用的编码 UTF-8)。
下一行描述文档的根元素<beans>,(像在说:“本文档包含一个多个Bean “):
接下来就是子元素<bean>了。具体标签含义就不说了。
我想说的是文档头部的xmlns=".*", xmlns:xsi=".*",xsi:schemaLocation=".*"类似字样的一坨代码含义。
这些就是命名空间。
1.命名空间
a)为什么要有命名空间?
XML 命名空间提供避免元素命名冲突的方法。
在 XML 中,元素名称是由开发者定义的,当两个不同的文档使用相同的元素名时,就会发生命名冲突。
b)默认的命名空间(Default Namespaces)
为元素定义默认的命名空间可以让我们省去在所有的子元素中使用前缀的工作。
格式:xmlns="namespaceURI"
c)xsi:schemaLocation
<xsi:schemaLocation="list of anyURI" >
schemaLocation 属性引用具有目标命名空间的 XML 架构文档。
xsi:schemaLocation属性的值由一个URI引用对组成,两个URI之间以空白符分隔。第一个URI是名称空间的名字,第二个URI给出模式文档的位置,模式处理器将从这个位置读取模式文档,该模式文档的目标名称空间必须与第一个URI相匹配
2.XSD (xml Schema Definition)
Xml Schema的用途
1. 定义一个Xml文档中都有什么元素
2. 定义一个Xml文档中都会有什么属性
3. 定义某个节点的都有什么样的子节点,可以有多少个子节点,子节点出现的顺序
4. 定义元素或者属性的数据类型
5. 定义元素或者属性的默认值或者固定值
具体语法,就不讲了,有兴趣的可以搜索。
DTD(Document Type Definition文档类型定义)的作用是定义 XML 文档的合法构建模块。
功能和XSD类似。具体使用如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" " http://www.springframework.org/dtd/spring-beans.dtd ">
XSD,知道即可,spring2.0中使用XSD验证。
二、解析XML需要关注点
1.XML文档如何转换为系统资源
2.使用什么引擎解析
3.解析文档元素,解析为数据载体对象
接下来,我们就一一回答这三个问题。
1.XML文档如何转换为系统资源
public int loadBeanDefinitions(Resource resource) throws BeanDefinitionStoreException {
return loadBeanDefinitions(new EncodedResource(resource));
}