我们在做springmvc项目时经查会看到xml文件中的这种配置,那么他是什么呢
<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-4.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">
xmlns是用来定义xml的命名空间的,那么命名空间是什么,有何作用?
先举个例子,做个类比:
假设我们编程序要创建一个User对象,但是com.a.entity包下有这个User类,com.b.entity包下也有User类,User的属性方法各不相同,程序并不知道你要创建哪个User,于是我们要导入包import com.a.entity.User,程序便清楚了
那么来看xml,我们在xml可以定义任何元素,假设我们在a.xml中定义了一个<user></user>节点,b.xml中也定义了一个<user></user>节点,当程序运行合并xml元素时,程序也不知道要取哪个<user>节点,便有了冲突,怎么办呢?我们也可以定义我们的user元素是来自哪个“包”下面的,于是便有了命名空间,用来定义我的元素来自于哪里
在a.xml中定义xmlns:a="http://xx.com/a",其中a为命名空间http://xx.com/a的别名,在定义user时这样做<a:user></a:user>,b.xml中同理<b:user></b:user>,这样程序便能区分user元素来自哪个定义文件了
当然,在一个xml中可以引入多个命名空间,类似于我们的程序中import多个包,但是全部都使用别名前缀来定义元素似乎很麻烦,所以我们可以选择一个作为默认的xmlns="http://xx.com/default",default下的元素不需要前缀
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"用来定义命名空间所对应的实例定义
xsi:schemaLocation="http://xx.com/a http://xx.com/a/a-3.0.xsd"
他的value总是成对出现,中间空格隔开,空格前面的是我们引入的命名空间,后边是指向的真实地址,因为命名空间可能有多个版本,如果不定义xsi:schemaLocation则默认使用命名空间最新版本文件
在springmvc项目启动时,会检查xml文件的正确性,如果每次到命名空间网络地址去请求文件的话,断网就会有问题,所以他加入了离线文件,在相应的jar包中,存在命名空间的xsd文件,且保存了多个版本的xsd文件,为了升级或降级spring版本时方便
那么命名空间的定义文件如何来写呢(比如http://xx.com/a/a-3.0.xsd)?目前有两种技术,一种是dtd(文档类型定义),一种是schema,他相对于dtd功能更加强大,所以spring采用的都是基于schema的命名空间定义,而html一般是dtd定义,详细比较见后续博客
schema不但可以解决同名元素的问题,还可以定义元素的类型,以及字段,程序据此便可以校验xml配置的是否正确
命名空间在多种文件类型中都可引入,例如xml,htm,html等等
网友评论