SpringconfigurationXML模式:有没有版本?
我是Spring的新手。 有一件令我困惑的事情是,有时候我会看到带有版本模式的XMLconfiguration文件,但有时却使用非版本模式。 例如,有时我会看到类似的东西
<?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-beans
和spring-context
模式是不同的。
所以,我的问题是,你会使用哪种风格,为什么? 特别是版本化的模式将来会不可用,而当Spring更新模式时,非版本化的模式是否与当前的应用程序兼容?
一个侧面的问题是,我在哪里可以find版本化的spring模式列表?
非常感谢!
build议使用“无版本”XSD,因为它们映射到您在应用程序中使用的框架的当前版本。
应用程序和工具不应该尝试从Web上获取这些XSD ,因为这些模式包含在JAR中。 如果他们这样做,通常意味着您的应用程序正在尝试使用比您正在使用的框架版本更新的XSD,或者您的IDE /工具未正确configuration。
据我所知,只有一种情况需要使用特定的XSD版本:尝试使用在较新版本中已被弃用/修改的XML属性。 这并不常发生。
无论如何,Spring团队应该放弃Spring 5.0的版本模式,参见SPR-13499 。
更多关于“无版本==当前版本”:
这些XSD文件包含在Spring JAR中 – 在构build过程中,“无版本”的XSD被映射到最新版本(请参阅实际创build该链接的spring.schemas文件)。 此外,在线提供的文件也是以相同的方式构build的(请参阅Gradle构build中的“schemaZip”目标 )。
我不确定他们是否是一个指导,但我个人的偏好是指非版本化的模式 – 一般来说,如果你正在对付更新版本的Spring项目(Spring核心,集成等),那么你可以参考未版本化的模式。
未版本化的模式指向了最新版本的项目,所以如果你使用的是真正的旧版本的Spring(比如说2.5版本与当前发布的4.0版本),它们可能不是正确的语法,在这种情况下,它可能会更好指向版本化的模式。
还有一点是,如果可能的话,最好避免使用xml,并使用基于Java的@Configuration风格来configurationSpring bean。
我知道这个问题已经过了两岁了,但我的意见是谨慎行事。
就我而言,我正在开发一个独立的CLI工具,一jarjar子。 而当我声明的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)
人们可以试着看看究竟是通过传递依赖来拉动什么东西(尽pipe仔细的检查显示我们拉着正确的包含正确的xsds的jar子(并且确保我们在build造超级食物的时候正确地与树荫插件合并) -jars。)
显然是YMMV。 如果它适用于一个项目,效果会更好。 但是,如果你开始看到奇怪的错误,无法解释,你没有带宽追赶他们的根源,更好的是精确。
反之,如果你改变了你的spring依赖关系的版本,你需要确保显式的xsd版本是正确的。 在软件中,这完全取决于权衡(并且知道你的决定是什么)。
你会在你的jar中findMETA-INF / spring.schemas文件。 该文件定义了所有兼容的xsd版本。 如果您指向没有任何版本号的URL,默认情况下它将与您的Jar文件兼容。 至于在classpath中没有两个不同版本的spring jar,你的应用程序将不会有任何运行时错误。