当前位置: 首页 > 知识库问答 >
问题:

Spring配置XML模式:有版本还是没有版本?

艾谦
2023-03-14

我是新来的Spring。让我困惑的一件事是,有时我看到带有版本化模式的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>

请注意,在这两个示例中,sping-beansping-上下文模式是不同的。

所以,我的问题是,你会使用哪种风格,为什么?特别是,版本化模式将来会变得不可用吗?当Spring更新模式时,非版本化模式会与当前应用程序保持兼容吗?

一个附带的问题是,我在哪里可以找到版本化的spring模式列表?

非常感谢!

共有3个答案

诸葛砚
2023-03-14

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

在我的例子中,我正在开发一个独立的CLI工具,一罐罐罐。当我声明的XSD是无版本的(原文如此)时,我会注意到非常奇怪的错误。考虑下面的XML片段:

如果没有这些版本,属性占位符中的value分隔符属性将导致以下错误:

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的罐子(并确保我们在构建uber-jar时正在做正确的属性与阴影插件合并)。)

显然是YMMV。如果它适用于一个项目,效果会更好。但是,如果你开始看到难以解释的奇怪错误,而你没有足够的带宽去追查它们的根本原因,那么最好是准确一点。

相反的论点是,如果您更改了Spring依赖项的版本,您需要确保显式xsd版本是正确的。在软件中,这一切都是关于权衡(以及知道你的决定会带来什么)。)

傅雪松
2023-03-14

我不确定它们是否是一个指南,但我个人的偏好是参考非版本化的模式——一般来说,如果你在对抗Spring项目的最新版本(Spring核心、集成等),那么你可以参考非版本化的模式架构。

未版本化的模式指向项目的最新版本,因此如果您使用的是非常旧的Spring版本(比如2.5版和当前发布的4.0版),那么它们可能不是正确的语法,在这种情况下,最好指向版本化的模式。

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

百里胜泫
2023-03-14

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

应用程序和工具不应该试图从Web获取这些XSD,因为这些模式包含在JAR中。如果他们这样做了,这通常意味着你的应用试图使用比你正在使用的框架版本更新的XSD,或者你的IDE/工具没有正确配置。

据我所知,只有一种情况下您希望使用特定的XSD版本:当尝试使用在最近版本中被弃用/修改的XML属性时。至少可以说,这种情况不常发生。

无论如何,Spring团队应该放弃Spring 5.0的版本化模式,请参见SPR-13499。

更多关于"versionless==当前版本":

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

 类似资料:
  • 问题内容: 我是Spring的新手。让我感到困惑的是,有时我看到带有版本化模式的XML配置文件,而有时却看到非版本化模式的XML配置文件。例如,有时我看到类似 有时像这样: 请注意,两个示例中的和模式是不同的。 所以,我的问题是,你将使用哪种样式以及为什么使用?特别是,将来版本更新的架构会不可用,并且当Spring更新架构时,非版本化的架构会与当前应用程序保持兼容吗? 另一个问题是,在哪里可以找到

  • 请考虑以下示例:https://logging.apache.org/log4j/2.x/manual/configuration.html 使用上面的示例,我得到了以下输出: 并且没有记录任何内容。 为了解决这个问题,我必须使用其他模式,比如: 这是唯一的工作方式和日志的东西。 顺便说一句,我正在使用以下maven依赖项导入:

  • 问题内容: 我点“ opencc” 当我外壳下面的代码 表明 但“ ____init__.py”和“ version.py”位于同一目录C:\ Python34 \ lib \ site-packages \ opencc 文件:version.py 当我改变 进入 OpenCC的,它的作品 我知道这没什么大不了,但我只想知道为什么init.py无法将模块version.py导入同一目录中, 问题

  • 目前移动统计iOS SDK默认统计的版本为AppStore中的版本号,即CFBundleShortVersionString的值。如果您有自己设置版本的需求,可以设置shortAppVersion属性的值。具体设置方法参见本文档基础配置部分。

  • 目前移动统计Android SDK默认统计的版本为AndroidManifest.xml中配置的版本号,即android:versionName="xxx"的值。 如果您希望自定义APP版本号,可以通过API StatService.setAppVersionName(Context context, String versionName)进行设置。一般建议无需此设置,除非特殊需要,比如对于SDK

  • 问题内容: 最近,我一直在研究前一段时间开发的项目中的一些改进,这就是我所发现的。pom文件中的许多依赖项都没有指定版本,但是已经解决了。该项目包含1个根模块和2个子模块。使用了Aggregator模式,这意味着根本没有dependencyManagement部分。上层项目仅聚合了2个模块,仅此而已。子项目并不将其称为父项。他们有不同的父母。我无法理解的是,子项目本身或它们的父项(事实上,它也没有