来自该博客的技术

一、Spring配置文件头

最初Spring配置文件的头部声明如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN"
"http://www.springframework.org/dtd/spring-beans-4.3.dtd">
<beans>  </beans>

1、第一行表示xml声明,任何格式良好的xml文档都必须第一行是声明。相当于告诉解析器这个是xml文档,你给我用xml解析器解析。
2、dtd声明,表示该xml里的元素和属性等需符合spring-beans-2.0.xsd这个文档类型定义标准。
3、DTD:文件的文件类型定义(Document Type Definition)可以看成一个或者多个 XML 文件的模板,在这里可以定义 XML 文件中的元素、元素的属性、元素的排列方式、元素包含的内容等等。
因为DTD的一些局限性,以及XML Schema对数据类型和命名空间的支持。XML Schema很快将 DTD 取而代之
被XML Schema 取代后的Spring 配置:

<?xml version="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/beanshttp://www.springframework.org/schema/beans/spring-beans-4.3.xsd"></beans>

XML Schema空间作用:
1、避免命名冲突,与Java中的package类似
2、将不同作用的标签分门别类(像Spring中的tx命名空间针对事务类的标签,context命名空间针对组件的标签)

代码解释:
1、xmlns=“http://www.springframework.org/schema/beans”
声明xml文件默认的命名空间,表示未使用其他命名空间的所有标签的默认命名空间。

2、xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”
声明XML Schema 实例,声明后就可以使用 schemaLocation 属性了
3、xmlns:aop=“http://www.springframework.org/schema/aop”
声明前缀为aop的命名空间,后面的URL用于标示命名空间的地址不会被解析器用于查找信息。其惟一的作用是赋予命名空间一个惟一的名称。当命名空间被定义在元素的开始标签中时,所有带有相同前缀的子元素都会与同一个命名空间相关联。

4、xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
这个从命名可以看出个大概,指定Schema的位置这个属性必须结合命名空间使用。这个属性有两个值,第一个值表示需要使用的命名空间。第二个值表示供命名空间使用的 XML schema 的位置

所以我们需要什么样的标签的时候,就引入什么样的命名空间和Schema 定义就可以。
二、XSD有没有版本号的区别
通常情况下,namespace对应的URI是一个存放XSD的地址

<?xml version="1.0" encoding="UTF-8"?>
<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"xmlns:aop="http://www.springframework.org/schema/aop"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-4.2.xsdhttp://www.springframework.org/schema/beans/spring-beans-4.2.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-4.2.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop-4.2.xsd">
</beans>

schemaLocation提供了一个xml namespace到对应的XSD文件的一个映射,所以我们可以看到,在xsi:schemaLocation后面配置的字符串都是成对的,前面的是namespace的URI,后面是xsd文件的URI。
Spring默认在启动时是要加载XSD文件来验证xml文件的,所以如果有的时候断网了,或者一些开源软件切换域名,那么就很容易碰到应用启动不了。曾经Oracle收购Sun公司时,遇到过这个情况。为了防止这种情况,Spring提供了一种机制,默认从本地加载XSD文件。打开spring-context-4.2.0.RELEASE.jar,可以看到里面有两个特别的文件:

你可以使用的xsd文件版本都在里头
spring.handlers

以想到Spring是把XSD文件放到本地了,再在spring.schemas里做了一个映射,优先从本地里加载XSD文件。
并且Spring很贴心,把旧版本的XSD文件也全放了。这样可以防止升级了Spring版本,而配置文件里用的还是旧版本的XSD文件,然后断网了,应用启动不了。
我们还可以看到,在没有配置版本号时,用的就是当前版本的XSD文件:

结论:不要在Spring的配置文件中配置XSD的版本号,因为没配置版本号时,默认取当前jar里的XSD文件,减少了各种风险。而且这样约定大于配置的方式很优雅。

Spring自学日志00(Spring配置文件头及xsd文件版本浅析)相关推荐

  1. Spring自学日志01

    1-Spring的概念 spring的作用:使现有技术更容易使用,本事是一个大杂烩,整合了现有的技术框架. SSH:Struct2+Spring+Hibernate! SSM:SpringMVC+Sp ...

  2. Spring Aop 日志管理及配置文件的详细配置

    Spring 带给我们的另一个好处就是让我们可以"专心做事",下面我们来看下面一个例子: public void doSameSomesing(int age,String nam ...

  3. Spring自学日志07(整合Mybatis)

    具体步骤 1.导入相关jar包 .junit .mybatis .mysql数据库 .spring相关 .AOP支持 .mybatis-spring[new] build.gradle plugins ...

  4. Spring自学日志02(对象的创建,依赖注入)

    IOC创建对象的方式 无论是否使用,只有在xml文件中被注册(bean),就会被创建. 1.用无参构造创建对象 <!--无参构造创对象 类型 变量名 = new 类型(); Hello hell ...

  5. Spring自学日志04(java的方式配置Spring)

    使用java的方式配置Spring 稳现在完全不使用xml配置,java来做 javaConflg是spring的一个子项目,在Spring4后,它成为了一个核心功能. import com.java ...

  6. Spring自学日志06(Aop)

    什么是AOP 面向切面编程,通过预编译的方式和运行期动态代理实现程序功能的同一维护的技术. 利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时 ...

  7. Spring自学日志03(作用域,自动装配)

    bean的作用域 Singleton(单例模式,是默认spring的) <bean id ="user2" class="com.injection.User&qu ...

  8. Spring自学日志05(代理模式)

    为什么要学习代理模式?因为这就是SpringAOP的底层! 抽象角色:一般是接口或抽象类 真实角色:被代理的角色 代理角色:代理真实角色,代理后还会做一些附属操作 客户:访问代理角色的人 静态代理模式 ...

  9. 让你的spring-boot应用日志随心所欲--spring boot日志深入分析

    1.spring boot日志概述 spring boot使用Commons Logging作为内部的日志系统,并且给Java Util Logging,Log4J2以及Logback都提供了默认的配 ...

最新文章

  1. java自由布局_java怎么在界面上随意摆放位置?
  2. easyui datagrid 实现单选并能取消单选
  3. python连接mongodb数据库、创建用户_mongodb对数据库创建用户名和密码
  4. 计算机金融专业课程方案,《计算机在金融业中的应用》教学实施方案
  5. dom4j 解析xml文件demo
  6. 检测 邮箱地址 是否存在[C#]
  7. html flash rtmp,Web直播之RTMP协议:vue-video-player + videojs-flash
  8. Mybatis3全面详解
  9. SAP-MM知识精解-批次管理(06-02)-批次确定的举例说明
  10. 代价敏感随机森林Python附代码
  11. 十分钟接入WO+能力共享平台
  12. r5 5600g和5600x的区别 选哪个好
  13. 搭建公众号微商城+小程序微商城 企业商城系统一条龙 拖拽可视化装修模板
  14. 咸阳无房证明网上办理指南
  15. 软考高级-信息系统管理师之质量管理(最新版)
  16. 实验........
  17. 网页打不开QQ能上(外挂、加速器、翻墙工具等导致winsock异常)
  18. 博客园——打造不一样的个人博客
  19. 读《区块链革命 》有感
  20. 老白智慧药房显示服务器异常,老白智慧药房

热门文章

  1. Python带参数的装饰器
  2. 高可用Mysql架构_Mysql主从复制、Mysql双主热备、Mysql双主双从、Mysql读写分离(Mycat中间件)、Mysql分库分表架构(Mycat中间件)的演变...
  3. UML总结---UML九种图关系说明
  4. Javascript高级程序设计3笔记 - 对象
  5. [Node.js] mySQL数据库 -- 英雄管理系统(完善)
  6. JavaScript 浏览器对象BOM
  7. IE6不支持min-heigt的bug解决的办法
  8. 15. 3 Sum (C,Python)
  9. 汇编语言---乘法指令及符号扩展
  10. 解决ubuntu和windows之间无法复制粘贴问题