Примечание: тестовый проект я упоминаю можно скачать с:Spring DI applicationContext.xml как именно используется xsi: schemaLocation?
мерзавца клоном https://github.com/mperdikeas/so-spring-di-appcontext-schemalocation.git
.. и работать с «муравьем перспективой».
Я понимаю, что имена пространства имен XML просто используются как непрозрачные идентификаторы и не предназначены для использования в качестве URI (wikipedia). Я также понимаю, что расположение схем XML предназначено для предоставления подсказок относительно фактического расположения документов схемы и, будучи намеками, не используется на практике (w3.org). Имея это в виду, я экспериментировал с простым приложением Spring DI (используемым в простой настройке J2SE), изменяя applicationContext.xml. Вот стартовая версия:
<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"
xmlns:p = "http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd">
<context:component-scan base-package="atm"/>
<context:property-placeholder location="classpath:META-INF/spring/atm.properties"/>
<bean id="soapTransport_" class="atm.SoapATMTransport" p:retries="${transport.retries}"/>
Когда я сделал «Судо Ifconfig eth0 вниз» проект работал отлично, который соответствует времени выполнения не удосужившись принести что-нибудь из schemaLocations. Однако, когда я искажаюсь в schemaLocations путем добавления простого подчеркивания ко второму URL в каждой паре я получил следующую жалобу:
[java] org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException: Line 10 in XML document from class path resource [META-INF/spring/applicationContext.xml] is invalid; nested exception is org.xml.sax.SAXParseException; lineNumber: 10; columnNumber: 100; cvc-elt.1: Cannot find the declaration of element 'beans'.
[java] at org.apache.tools.ant.taskdefs.ExecuteJava.execute(ExecuteJava.java:194)
[java] at org.apache.tools.ant.taskdefs.Java.run(Java.java:771)
[java] at org.apache.tools.ant.taskdefs.Java.executeJava(Java.java:221)
[java] at org.apache.tools.ant.taskdefs.Java.executeJava(Java.java:135)
[java] at org.apache.tools.ant.taskdefs.Java.execute(Java.java:108)
[java] at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:291)
[java] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[java] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
[java] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
[java] at java.lang.reflect.Method.invoke(Method.java:601)
[java] at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106)
[java] at org.apache.tools.ant.Task.perform(Task.java:348)
[java] at org.apache.tools.ant.Target.execute(Target.java:390)
[java] at org.apache.tools.ant.Target.performTasks(Target.java:411)
[java] at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1399)
[java] at org.apache.tools.ant.Project.executeTarget(Project.java:1368)
[java] at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:41)
[java] at org.apache.tools.ant.Project.executeTargets(Project.java:1251)
[java] at org.apache.tools.ant.Main.runBuild(Main.java:809)
[java] at org.apache.tools.ant.Main.startAnt(Main.java:217)
[java] at org.apache.tools.ant.launch.Launcher.run(Launcher.java:280)
[java] at org.apache.tools.ant.launch.Launcher.main(Launcher.java:109)
который, кажется, предположить, что Spring DI среда выполнение использует второй URL в каждой паре в XSI : schemaLocation как некоторый идентификатор (жестко закодированный в его логике, так как нет доступа к сети). Таким образом, мое предположение было бы в том, что среда выполнения Spring DI использует два типа идентификаторов для каждого пространства имен: идентификатор xmlns, который однозначно идентифицирует пространство имен (используется как непрозрачная строка) и идентификатор schemaLocation, чтобы однозначно идентифицировать версию схемы для этого пространство имен (снова используется как непрозрачная строка). То есть schemaLocation фактически используется (в искаженном виде, поскольку это не похоже на намерение документов w3c) на версию пространства имен. Кроме того, в таком случае, почему среда исполнения Spring DI не жалуется на отсутствие схемы Location для пространства имен «p ». Является ли моя ментальная модель правильной?
Спасибо, это понятно модель. Еще два вопроса, если я могу: [1] в библиотеках моего проекта есть только один файл spring.schemas (в spring.jar), и он, похоже, не содержит сопоставления, такие как тот, который вы описываете для «xsi» и 'p' пространства имен (хотя я мог бы найти сопоставления «контекст» и корневое пространство имен), [2], где это документация о документах? –
@MenelaosPerdikeas: К сожалению, я не знаю ответов на оба [1] и [2]. –