目录

​1.老版本applicationContext.xml中的dtd约束文件​

​2.新版本applicationContext.xml中的xsd约束文件​

​     2.1 什么是XML命名空间​

​     2.2 XML命名空间的声明与使用​

​     2.3 Spring配置文件配置命名空间​

​3.总结​


1.老版本applicationContext.xml中的dtd约束文件

       在Spring的核心配置文件applicationContext.xml中我们总能看到如下图这样的配置:

Spring配置文件头及xsd约束文件详解_spring配置

红框里的部分的作用究竟是什么呢?想了解这个问题我们先看一下老版本的applicationContext.xml配置文件:

Spring配置文件头及xsd约束文件详解_spring配置_02

       第一行表示xml声明,任何格式良好的xml文档第一行都必须是声明,相当于告诉解析器此文档是xml文档,请用xml解析器进行解析。下面的dtd文件又是什么呢?通过dtd文件上面的注释我们可以了解到如下信息:

  1. 定义了一种简单而一致的方法用于创建不同命名空间下的JavaBeans对象,由SpringBeanFactory管理,由XmlBeanDefinitionReader读取。
  2. 大多数Spring功能都使用这种文档类型,包括基于bean工厂的web应用程序上下文。 
  3. 本文档中的每个“bean”元素定义一个JavaBean。典型的bean类与JavaBean属性和/或构造函数参数一起被指定。 
  4. bean实例可以是“单例”或“多例”。
  5. 还支持列表、集合、地图和java.util.Properties属性作为bean属性类型或构造函数参数类型。

       总结下为,applicationContext.xml的作用:为Spring上下文程序构建各组件基础启动类,比如HikariCP的HikariDataSource(数据连接池)或MyBatis的SqlSessionFactory(事务工厂)。而dtd文件的作用为:表示该xml里的元素和属性等需符合spring-beans-2.0.dtd文档类型定义标准,说白了就是告诉xml解析器按照什么样的规则去解析此xml文件

2.新版本applicationContext.xml中的xsd约束文件

     2.1 什么是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 中的包,不同的包下面可以存放相同的类名,只要在引入类时前面加上类的包就可以避免同名类的冲突。

     2.2 XML命名空间的声明与使用

       命名空间被声明为元素的属性。并不一定只在根元素声明命名空间,而是可以在 XML 文档中的任何元素中进行声明。声明的命名空间的范围起始于声明该命名空间的元素,并应用于该元素的所有内容,直到被具有相同前缀名称的其他命名空间声明覆盖,其中元素内容是指该元素的 <opening-tag> 和 </closing-tag> 之间的内容。

xmlns:aop="http://www.springframework.org/schema/aop"


       xmlns:类似于一个保留字,它只用于声明命名空间。换言之xmlns用于绑定命名空间,但其本身并不绑定到任何命名空间。

       aop:这里实际上是将前缀"aop"与命名空间"http://www.springframework.org/schema/aop"(此URI包含关于命名空间的信息)绑定在一起。通常我们会用一个比较简短或约定俗成的名字来作为命名空间的前缀(例如这里的aop),但具体使用什么前缀完全取决于个人。使用有意义的命名空间前缀增强了XML档的清晰性,所以可以看到我们平时在配置Spring配置文件的时候,前缀名都是aop(切面)、tx(事务)等命名方式。配置了前缀后,我们使用命名空间前缀如下:Spring配置文件头及xsd约束文件详解_spring配置_03

       这里我们在配置面向切面编程的内容时,使用aop前缀,代表后面的元素(config,advisor等)都是在http://www.springframework.org/schema/aop中定义的。请注意,前缀只用作占位符,并且必须通过可以识别命名空间的 XML 分析器进行解释才能使用绑定到该前缀的实际命名空间。

单个默认命名空间

       我们看到,在配置文件中,beans,bean等元素我们是没有使用命名空间前缀的。重复限定一个要在命名空间中使用的元素或属性可能会非常麻烦。这种情况下,可以声明一个默认命名空间。无论在任何时候都只能存在一个默认命名空间。声明一个默认命名空间意味着如果默认命名空间声明范围内的任何元素未使用前缀显式限定,则该元素将被隐式限定。与带前缀的命名空间一样,默认命名空间 也可以被覆盖。默认命名空间声明方式如下:

xmlns="http://www.springframework.org/schema/beans"


     2.3 Spring配置文件配置命名空间

       Spring 提供了对各种工具的xml scheme的配置方式。Spring在启动时会检验XML文件,如果xml空间存在命名空间内没有的元素会报错。通常情况下,命名空间对应的URI是一个存放XSD的地址,尽管规范没有这么要求。如果没有提供schemaLocation,那么Spring的XML解析器会从命名空间的URI里加载XSD文件。例如我们可以这样写:

xmlns="http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"


       则默认的命名空间就是加载指定的xsd文件。schemaLocation提供了一个xml 命名空间到对应的XSD(Xml Schema Definition)文件的一个映射,它的值由一个或多个URI引用对组成,两个URI之间以空白符分隔(空格和换行均可)。第一个URI是定义的 XML命名空间的值,第二个URI给出Schema文档的实际位置,Schema处理器将从这个位置读取Schema文档,该文档的targetNamespace必须与第一个URI(XML命名空间的值)相匹配。在xsi:schemaLocation后面配置的字符串都是成对的,前面的是命名空间的URI,后面是xsd文件的URI:

Spring配置文件头及xsd约束文件详解_spring_04

       这里命名空间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的值和命名空间的值一样。如下:

Spring配置文件头及xsd约束文件详解_xml_05

3.总结

       引入XML Schema命名空间是为了避免命名冲突,就像Java中的package一样,将不同作用的标签分门别类,比如Spring中的tx命名空间针对事务类的标签,context命名空间针对组件的标签。