Подтвердить что ты не робот

Spring конфигурация XML-схема: с или без версии?

Я новичок в 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>

Обратите внимание, что схемы spring-beans и spring-context различаются в двух примерах.

Итак, мой вопрос: какой стиль вы бы использовали и почему? В частности, будет ли версия версия недоступна в будущем, и будет ли версия, не поддерживаемая версией, совместимой с текущим приложением, когда Spring обновит схему?

Вопрос: где я могу найти список версий Spring?

Большое спасибо!

4b9b3361

Ответ 1

Рекомендуется использовать "бездействующие" XSD, потому что они сопоставлены с текущей версией фреймворка, который вы используете в своем приложении.

Приложения и инструменты никогда не должны пытаться извлечь эти XSD из Интернета, поскольку эти схемы включены в JAR. Если это так, обычно это означает, что ваше приложение пытается использовать XSD, который является более поздним, чем используемая версия фреймворка, или что ваш IDE/инструмент не настроен должным образом.

Насколько мне известно, существует только один случай, когда вы хотите использовать определенные версии XSD: при попытке использовать атрибут XML, который устарел или изменен в более поздней версии. Это не случается часто, по меньшей мере.

В любом случае команда Spring должна отбросить версии версий для Spring 5.0, см. SPR-13499.

Подробнее о "versionless == текущей версии":

Эти XSD файлы включены в Spring JARs. XSD с "бездействием" сопоставляется с последней версией во время сборки (см. spring.schemas файлы, которые на самом деле сделать эту ссылку). Кроме того, файлы, доступные в Интернете, построены таким же образом (см. "schemaZip" цель в gradle сборке).

Ответ 2

Я не уверен, что это руководство, но мое личное предпочтение - ссылаться на не-версионные схемы - вообще, если вы работаете с более поздними версиями проектов Spring (Spring), интеграция и т.д.), тогда вы можете обратиться к неверсированным схемам.

Неверсифицированные схемы указывают на последнюю версию проектов, поэтому возможно, что они не могут быть правильной грамматикой, если вы используете действительно старую версию Spring (скажем, версию 2.5 по сравнению с выпущенной в настоящее время версии 4.0), в таких случаях лучше указать на версии схемы.

Еще один момент, который стоит здесь сделать, заключается в том, что, если возможно, лучше вообще избегать xml и перейти с стиль Java @Configuration, чтобы настроить Spring beans.

Ответ 3

Я знаю, что вопрос старше двух лет, но я должен действовать осторожно.

В моем случае я разрабатывал автономный инструмент CLI, банку банок. И когда мои объявленные XSD были бездействующими (sic), я бы заметил очень странные ошибки. Рассмотрим следующий фрагмент 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 (и гарантировали, что мы делаем правильное свойство, сливающееся с плагином тени, когда мы были построение uber-jars.)

Очевидно, YMMV. Если это работает для одного проекта, тем лучше. Но если вы когда-нибудь начнете видеть странные ошибки, которые бросают вызов объяснению, и у вас нет полосы пропускания, чтобы преследовать их до основной причины, лучше быть точным.

Контр-аргумент состоит в том, что если вы когда-либо меняете версию своих зависимостей spring, вам нужно убедиться, что явная версия xsd верна. В программном обеспечении речь идет о компромиссных решениях (и зная, с чем вы согласны).

Ответ 4

Вы найдете файл META-INF/ spring.schemas в своем банке. Этот файл определяет все совместимые версии xsd. Если вы укажете URL без номера версии, по умолчанию он будет совместим с вашим файлом Jar. Поскольку у вас нет двух разных версий spring jar в пути к классам, ваше приложение не будет иметь ошибок во время выполнения.

Ответ 5

Я зачислил курс spring на удемию. Я следовал за каждым шагом, который показал мне мой инструктор. Поэтому, если вы используете spring mvc и hibernate, вы можете столкнуться с этой ошибкой Не удалось прочитать документ схемы http://www.springframework.org/schema/tx/spring-tx.xsd 'и т.д. Для:

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

в моем конфигурационном файле spring у меня были эти два URL

    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 i.e, spring -mvc-4.2.xsd и spring -tx-4.2.xsd

Таким образом, по моему мнению, спецификация версии явно не является хорошей практикой. Надеюсь это поможет. Спасибо.

Ответ 6

Подумайте об использовании бездействующих xsd. Это заставит инструментарий подобрать версию xsd, соответствующую версии используемой вами пружинной банки (посмотрите файл spring.schemas в своей банке). В случае какой-либо несовместимости, когда вы обновляете свои библиотеки весны (что действительно должно быть редко), вы должны уловить ее во время сборки.

Это даст возможность решить, нужно ли вводить версию xsd с версией для этого одного файла или фактически перейти от использования архаичного и устаревшего атрибута/элемента. Надеюсь, это будет позже.

Иначе риск состоит в том, чтобы навсегда использовать возможный устаревший атрибут/элемент.