zoukankan      html  css  js  c++  java
  • Spring中xml文档的schema约束

    最开始使用Spring框架的时候,对于其配置文件xml,只是网上得知其使用方法,而不明其意。最近想着寻根问底的探究一下。以下是本文主要内容:

    1、配置文件示例。

     
    1. <?xml version="1.0" encoding="UTF-8"?>  
    2. <beans xmlns="http://www.springframework.org/schema/beans"        
    3.     xmlns:mvc="http://www.springframework.org/schema/mvc"     
    4.     xmlns:tx="http://www.springframework.org/schema/tx"  
    5.     xmlns:aop="http://www.springframework.org/schema/aop"  
    6.     xmlns:context="http://www.springframework.org/schema/context"  
    7.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"              
    8.     xsi:schemaLocation="                                               
    9.             http://www.springframework.org/schema/beans    
    10.             http://www.springframework.org/schema/beans/spring-beans.xsd    
    11.             http://www.springframework.org/schema/context     
    12.             http://www.springframework.org/schema/context/spring-context.xsd    
    13.             http://www.springframework.org/schema/mvc    
    14.             http://www.springframework.org/schema/mvc/spring-mvc.xsd  
    15.             http://www.springframework.org/schema/tx   
    16.             http://www.springframework.org/schema/tx/spring-tx.xsd  
    17.             http://www.springframework.org/schema/aop  
    18.             http://www.springframework.org/schema/aop/spring-aop.xsd "  
    19.     default-autowire="byName">  
    20. </beans>  

    上面是我们最常用的applicationContext.xml的配置文件的最开始部分,很多时候我们只是知道这些必须添加,但为什么,添加哪些都不甚清楚。我们知道spring在启动的时候会验证 xml文档,这些引入的schema即用来验证配置文件的xml文档语法的正确性。下面先来看看如何验证xml文档验证的相关知识。

    2、xml的schema约束

    先来说说xml文档的schema约束,它定义了xml文档的结构,内容和语法,包括元素和属性、关系的结构以及数据类型等等。有以下几点需要遵循:

    1) 、所有的标签和属性都需要Schema来定义。(schema本身由w3c来定义)。

    2)、所有的schema文件都需要以个ID,这里我们称之为 namespace,其值时一个url,通常是这个xml的xsd文件的地址。

    3)、namespace值由 targetNamespace属性来指定

    4)、引入一个schema约束,使用属性xmlns,属性值即为对应schema文件的命名空间 nameSpace。

    5)、如果引入的schema非w3c组织定义的,必须指定schema文件的位置,schema文件的位置由 schemaLocation来指定。

    6)、引入多个schema文件需要使用 别名。别名形式如下: xmlns:alias。

    3、对于上述配置文件的详细解读

    1)、 声明默认的名称空间(xmlns="http://www.springframework.org/schema/beans")

    2)、声明XML Schema实例名称空间(http://www.w3.org/2001/XMLSchema-instance),并将xsi前缀与该名称空间绑定,这样模式处理器就可以识别xsi:schemaLocation属性。XML Schema实例名称空间的前缀通常使用xsi

    3)、 使用xsi:schemaLocation属性指定名称空间(http://www.springframework.org/schema/beans)和模式位置(http://www.springframework.org/schema/beans/spring-beans.xsd)相关。XML Schema推荐标准中指出,xsi:schemaLocation属性可以在实例中的任何元素上使用,而不一定是根元素,不过,xsi:schemaLocation属性必须出现在它要验证的任何元素和属性之前。

    4)、使用别名引入多个schema文件。如上述 xmlns:mvc 、xmlns:tx 、xmlns:context等等。

    4、使用带版本号的xsd文件有何弊端?

    首先来看看Spring是如何验证xml文档的。Spring默认在启动时是要加载XSD文件来验证xml文件的,所以如果有的时候断网了,或者一些开源软件切换域名,那么就很容易碰到应用启动不了,为了防止这种情况,Spring提供了一种机制,默认从本地加载XSD文件。打开spring-context-4.1.2.RELEASE.jar,可以看到里面有两个特别的文件:
    spring.handlers如下:
    [plain] view plain copy
     
    1. http://www.springframework.org/schema/context=org.springframework.context.config.ContextNamespaceHandler  
    2. http://www.springframework.org/schema/jee=org.springframework.ejb.config.JeeNamespaceHandler  
    3. http://www.springframework.org/schema/lang=org.springframework.scripting.config.LangNamespaceHandler  
    4. http://www.springframework.org/schema/task=org.springframework.scheduling.config.TaskNamespaceHandler  
    5. http://www.springframework.org/schema/cache=org.springframework.cache.config.CacheNamespaceHandler  
    spring.schemas如下:
    [plain] view plain copy
     
    1. http://www.springframework.org/schema/context/spring-context-2.5.xsd=org/springframework/context/config/spring-context-2.5.xsd  
    2. http://www.springframework.org/schema/context/spring-context-3.0.xsd=org/springframework/context/config/spring-context-3.0.xsd  
    3. http://www.springframework.org/schema/context/spring-context-3.1.xsd=org/springframework/context/config/spring-context-3.1.xsd  
    4. http://www.springframework.org/schema/context/spring-context-3.2.xsd=org/springframework/context/config/spring-context-3.2.xsd  
    5. http://www.springframework.org/schema/context/spring-context-4.0.xsd=org/springframework/context/config/spring-context-4.0.xsd  
    6. http://www.springframework.org/schema/context/spring-context-4.1.xsd=org/springframework/context/config/spring-context-4.1.xsd  
    7. http://www.springframework.org/schema/context/spring-context.xsd=org/springframework/context/config/spring-context-4.1.xsd  
    8. http://www.springframework.org/schema/jee/spring-jee-2.0.xsd=org/springframework/ejb/config/spring-jee-2.0.xsd  
    9. http://www.springframework.org/schema/jee/spring-jee-2.5.xsd=org/springframework/ejb/config/spring-jee-2.5.xsd  
    10. http://www.springframework.org/schema/jee/spring-jee-3.0.xsd=org/springframework/ejb/config/spring-jee-3.0.xsd  
    11. http://www.springframework.org/schema/jee/spring-jee-3.1.xsd=org/springframework/ejb/config/spring-jee-3.1.xsd  
    12. http://www.springframework.org/schema/jee/spring-jee-3.2.xsd=org/springframework/ejb/config/spring-jee-3.2.xsd  
    13. http://www.springframework.org/schema/jee/spring-jee-4.0.xsd=org/springframework/ejb/config/spring-jee-4.0.xsd  
    14. http://www.springframework.org/schema/jee/spring-jee-4.1.xsd=org/springframework/ejb/config/spring-jee-4.1.xsd  
    15. http://www.springframework.org/schema/jee/spring-jee.xsd=org/springframework/ejb/config/spring-jee-4.1.xsd  
    16. http://www.springframework.org/schema/lang/spring-lang-2.0.xsd=org/springframework/scripting/config/spring-lang-2.0.xsd  
    17. http://www.springframework.org/schema/lang/spring-lang-2.5.xsd=org/springframework/scripting/config/spring-lang-2.5.xsd  
    18. http://www.springframework.org/schema/lang/spring-lang-3.0.xsd=org/springframework/scripting/config/spring-lang-3.0.xsd  
    19. http://www.springframework.org/schema/lang/spring-lang-3.1.xsd=org/springframework/scripting/config/spring-lang-3.1.xsd  
    20. http://www.springframework.org/schema/lang/spring-lang-3.2.xsd=org/springframework/scripting/config/spring-lang-3.2.xsd  
    21. http://www.springframework.org/schema/lang/spring-lang-4.0.xsd=org/springframework/scripting/config/spring-lang-4.0.xsd  
    22. http://www.springframework.org/schema/lang/spring-lang-4.1.xsd=org/springframework/scripting/config/spring-lang-4.1.xsd  
    23. http://www.springframework.org/schema/lang/spring-lang.xsd=org/springframework/scripting/config/spring-lang-4.1.xsd  
    24. http://www.springframework.org/schema/task/spring-task-3.0.xsd=org/springframework/scheduling/config/spring-task-3.0.xsd  
    25. http://www.springframework.org/schema/task/spring-task-3.1.xsd=org/springframework/scheduling/config/spring-task-3.1.xsd  
    26. http://www.springframework.org/schema/task/spring-task-3.2.xsd=org/springframework/scheduling/config/spring-task-3.2.xsd  
    27. http://www.springframework.org/schema/task/spring-task-4.0.xsd=org/springframework/scheduling/config/spring-task-4.0.xsd  
    28. http://www.springframework.org/schema/task/spring-task-4.1.xsd=org/springframework/scheduling/config/spring-task-4.1.xsd  
    29. http://www.springframework.org/schema/task/spring-task.xsd=org/springframework/scheduling/config/spring-task-4.1.xsd  
    30. http://www.springframework.org/schema/cache/spring-cache-3.1.xsd=org/springframework/cache/config/spring-cache-3.1.xsd  
    31. http://www.springframework.org/schema/cache/spring-cache-3.2.xsd=org/springframework/cache/config/spring-cache-3.2.xsd  
    32. http://www.springframework.org/schema/cache/spring-cache-4.0.xsd=org/springframework/cache/config/spring-cache-4.0.xsd  
    33. http://www.springframework.org/schema/cache/spring-cache-4.1.xsd=org/springframework/cache/config/spring-cache-4.1.xsd  
    34. http://www.springframework.org/schema/cache/spring-cache.xsd=org/springframework/cache/config/spring-cache-4.1.xsd  
    再打开jar包里的org/springframework/context/config/ 目录,可以看到下面有
    很明显,可以想到Spring是把XSD文件放到本地了,再在spring.schemas里做了一个映射,优先从本地里加载XSD文件。并且Spring很贴心,把旧版本的XSD文件也全放了。这样可以防止升级了Spring版本,而配置文件里用的还是旧版本的XSD文件,然后断网了,应用启动不了。
    从上述xml文档中可以看出,当没有配置版本号时,使用的即当前版本的xml schema文档。
     
    1. http://www.springframework.org/schema/context/spring-context.xsd=org/springframework/context/config/spring-context-4.1.xsd  
     
    上述即为对spring配置文档中的xml 文档验证的一部分说明,也是我在学习过程中所忽略的部分。文中有参考一些视频教程还有一篇博文 为什么在Spring的配置里,最好不要配置xsd文件的版本号
     
    本文章转载自
    Quartzhao的专栏

     

  • 相关阅读:
    HDU 1069 Monkey and Banana
    HDU 1029 Ignatius and the Princess IV
    HDU 1024 Max Sum Plus Plus
    Gym100923H Por Costel and the Match
    Codeforces 682C Alyona and the Tree
    Codeforces 449B Jzzhu and Cities
    Codeforces (ccpc-wannafly camp day2) L. Por Costel and the Semipalindromes
    Codeforces 598D (ccpc-wannafly camp day1) Igor In the Museum
    Codeforces 1167c(ccpc wannafly camp day1) News Distribution 并查集模板
    快乐数问题
  • 原文地址:https://www.cnblogs.com/zhrngM/p/9075633.html
Copyright © 2011-2022 走看看