Spring配置XML模式:有无版本?


75

我是Spring的新手。令我感到困惑的是,有时我看到带有版本化模式的XML配置文件,但有时却看到非版本化模式的XML配置文件。例如,有时我看到类似

<?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"
       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">

    <context:annotation-config/>

    <context:component-scan base-package="base.package"/>

</beans>

有时像这样:

<?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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">

    <context:annotation-config/>

    <context:component-scan base-package="base.package"/>

</beans>

请注意,两个示例中的spring-beansspring-context模式是不同的。

所以,我的问题是,您将使用哪种样式,为什么使用?特别是,将来版本更新的架构会不可用,并且当Spring更新架构时,非版本化的架构会与当前应用程序保持兼容吗?

另一个问题是,在哪里可以找到版本化的弹簧模式列表?

非常感谢!


Answers:


96

建议使用“无版本” XSD,因为它们已映射到您在应用程序中使用的框架的当前版本。

应用程序和工具切勿尝试从Web上获取那些XSD,因为这些模式已包含在JAR中。如果这样做,通常意味着您的应用正在尝试使用比您使用的框架版本更新的XSD,或者您的IDE /工具配置不正确。

据我所知,只有一种情况需要使用特定的XSD版本:当尝试使用在较新版本中已过时/修改的XML属性时。至少可以这样说,这通常不会发生。

无论如何,Spring团队应该删除Spring 5.0的版本化架构,请参阅SPR-13499

有关“无版本==当前版本”的更多信息:

这些XSD文件包含在Spring JAR中-在构建期间,“无版本” XSD被映射到最新版本(请参阅实际建立该链接的spring.schemas文件)。另外,可用的在线文件以相同的方式构建(请参阅gradle构建中“ schemaZip”目标)。


众所周知,schemaLocation中的信息是作为“提示”提供给xml处理器的。因此,当xml处理器分析xml时,它将发现符合spring.schemas定义的xsd文件。但是我无法理解的一件事是,对于xml编辑器,如果定义了schemaLocation,则在键入时它将自动完成,那么它怎么知道呢?它还引用了spring.schemas中的定义?还是从远程服务器下载xsd文件?如果从远程服务器下载文件,也就是说,如果我们不指定版本,则它引用最新版本。
罗基·胡

如果从远程服务器下载文件,则可能会出现一种情况,因此xsd始终是最新版本,因此,如果在最新版本中定义了元素,而不在我们的项目使用的版本(较低版本)中定义了元素,会发生什么情况?xml处理器从本地jar加载xsd,并且无法识别元素定义。
罗基·胡

我遇到过这样的情况:版本导致我出现HTTP 404 ...我的意思是删除版本后它可以正常工作。你知道为什么吗 ?
Bloomberg58年

我无法确保eclipse 09-2018永远不会从Web上获取Spring模式。由于Spring Integration在URL中没有版本的在线XSD都是古老的1.0版,因此这会导致Eclipse编辑器中XML出现零星的错误标记。看到important note这里在线XSD:springframework.org/schema/integration/spring-integration.xsd或位置:springframework.org/schema/integration/xml/...
Selaron

4

我不确定它们是否是指导,但是我个人偏向于引用非版本化的模式-通常,如果您使用的是Spring项目的较新版本(Spring核心,集成等),则可以请参考未版本控制的架构。

未版本化的架构指向项目的最新版本,因此如果您使用的是Spring的真正旧版本(例如,针对当前发布的4.0版本为2.5版),则它们可能不是正确的语法,在这种情况下可能会更好指向版本化架构。

这里要指出的另一点是,如果可能的话,最好完全避免使用xml,最好使用基于Java的@Configuration样式来配置Spring Bean。


1

我知道这个问题已有两年多了,但是我要谨慎行事。

就我而言,我正在开发一个独立的CLI工具,即一罐jar。当我声明的XSD没有版本时,我会注意到非常奇怪的错误。考虑以下xml片段:

在此处输入图片说明

没有版本,value-separator属性占位符中的属性将导致以下错误:

org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException: Line 22 in XML document from class path resource [META-INF/slitools/sli-cli-applicationContext.xml] is invalid; nested exception is org.xml.sax.SAXParseException: cvc-complex-type.3.2.2: Attribute 'value-separator' is not allowed to appear in element 'context:property-placeholder'.
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:399)

可以尝试通过传递依赖项查看到底是什么(即使仔细检查显示我们正在提取包含正确的xsds的正确的jar(并确保在构建uber时我们将正确的属性与shade插件合并) -jars。)

显然是YMMV。如果它适用于一个项目,那就更好了。但是,如果您开始发现无法解释的奇怪错误,并且您没有足够的带宽追究它们的根本原因,那么最好是准确地说。

与此相反的是,如果您曾经更改spring依赖项的版本,则需要确保显式的xsd版本正确。在软件中,这完全是权衡取舍(并知道您在决策中会遇到的事情。)


好点子。我在想,考虑较低版本的配置声明可能会在较高版本上中断。
Ankit

1

我已经报名参加了udemy春季课程。我按照老师指示我执行的每一个步骤进行操作。因此,如果您使用Spring MVC和Hibernate,则可能会遇到以下错误:无法读取架构文档“ http://www.springframework.org/schema/tx/spring-tx.xsd ”,例如:

<mvc:annotation-driven/> and <tx:annotation-driven transaction-manager="myTransactionManager" /> elements

在我的春季配置文件中,我有这两个网址

    http://www.springframework.org/schema/mvc
    http://www.springframework.org/schema/mvc/spring-mvc.xsd

    http://www.springframework.org/schema/tx 
    http://www.springframework.org/schema/tx/spring-tx.xsd

在xsi:schemaLocation中,我将其替换为

    http://www.springframework.org/schema/mvc
    http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd

    http://www.springframework.org/schema/tx 
    http://www.springframework.org/schema/tx/spring-tx-4.2.xsd

实际上,我访问了这两个网站 http://www.springframework.org/schema/mvc/http://www.springframework.org/schema/tx/, 并且仅添加了spring-mvc和spring-tx的最新版本,即,spring-mvc-4.2.xsd和spring-tx-4.2.xsd

因此,我认为明确指定版本不是一个好习惯。希望这可以帮助。谢谢。


0

您将在Jar中找到META-INF / spring.schemas文件。该文件定义了所有兼容的xsd版本。如果您指向没有任何版本号的URL,则默认情况下它将与您的Jar文件兼容。只要您在类路径中没有两个不同版本的spring jar,您的应用程序就不会有任何运行时错误。


0

考虑使用无版本的xsd。这将使工具选择与您正在使用的spring jar版本匹配的xsd版本(请查看jar中的spring.schemas文件)。如果在升级spring库时出现任何不兼容的情况(这确实很少见),那么您应该能够在构建期间捕获它。

这将提供一个机会来决定是否需要为该文件引入版本化的xsd,或者是否需要从使用过时的,过时的属性/元素演变而来。希望会是以后。

否则,风险就是永远使用可能不推荐使用的属性/元素。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.