Схема 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-beans и spring-context схемы отличаются в двух примерах.



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



побочный вопрос: где я могу найти список версионных схем spring?



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

526   6  

6 ответов:

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

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

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

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

подробнее о "versionless = = текущая версия":

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

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

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

еще один момент здесь заключается в том, что, если это возможно, лучше вообще избегать xml и идти с Java based @Configuration стиль для настройки ваших весенних бобов.

Я знаю, что вопрос более двух лет, но мое мнение, чтобы действовать с осторожностью.

в моем случае я разрабатывал автономный инструмент CLI, банку банок. И когда мои объявленные XSDs были версионными (sic), я бы заметил Очень странные ошибки. Рассмотрим следующий фрагмент xml:

enter image description here

без версий,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 (и гарантировали, что мы делаем правильное свойство, сливающееся с плагином shade, когда мы строим uber-jars.)

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

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

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

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

<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 и весна-TX я.е, весна в MVC-4.2.xsd и spring-tx-4.2.xsd

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

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

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

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

Comments

    Ничего не найдено.