注: 私が言及しているテスト プロジェクトは、次の方法でダウンロードできます。
git クローン https://github.com/mperdikeas/so-spring-di-appcontext-schemalocation.git
.. 'ant run' で実行します。
XML名前空間名は不透明な識別子として使用されるだけで、URIとして使用されることを意図していないことを「理解」しています( wikipedia )。また、XML スキーマの場所は、スキーマ ドキュメントの実際の場所に関するヒントを提供するためのものであり、ヒントであるため、実際には使用されないことも「理解」しています ( w3.org )。そのことを念頭に置いて、applicationContext.xml を変更することにより、単純な Spring DI アプリケーション (単純な J2SE 設定で使用) を試してきました。開始バージョンは次のとおりです。
<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}"/>
「sudo ifconfig eth0 down」を実行すると、プロジェクトは完全に実行されました。これは、schemaLocations から何もフェッチする必要のないランタイムと一致しています。しかし、各ペアの 2 番目の URL に単純なアンダースコアを追加して schemaLocations を壊したところ、次のような苦情がありました。
[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 ランタイムが xsi:schemaLocation の各ペアの 2 番目の URL をある種の識別子として使用することを示唆しているようです (ネットワーク アクセスがないため、ロジックでハードコーディングされています)。したがって、Spring DI ランタイムは名前空間ごとに 2 種類の識別子を使用すると仮定します。名前空間を一意に識別するxmlns識別子 (不透明な文字列として使用) と、その名前空間のスキーマ バージョンを一意に識別するschemaLocation識別子 (再び使用)不透明な文字列として)。つまり、名前空間をバージョン管理するためにschemaLocationが実際に使用されます (ゆがんだ方法で? それはw3cドキュメントの意図ではないようです)。さらに、そのような場合、Spring DI ランタイムは、なぜ" p " 名前空間のschemaLocation 。私のメンタルモデルは正しいですか?