9

注: 私が言及しているテスト プロジェクトは、次の方法でダウンロードできます。

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 。私のメンタルモデルは正しいですか?

4

1 に答える 1

13

何が起こるかは次のとおりです。

  • XML スキーマを使用すると、XML 名前空間にエイリアス (短縮名) を定義できます。技術的には、すべての名前空間は完全な URI で識別されますが、これは非常に面倒なので、contextや などの短いエイリアスを使用できますpxmlns属性によって示されるデフォルトの名前空間もあります

  • デフォルトでは、XML パーサーは名前空間 URI が XSD ファイルの URL の場所でもあると想定します。これはよくあることですが、仕様では要求されていません。これは、属性を指定しない場合の Spring の XML パーサーの動作方法でもありschemaLocationます。

  • schemaLocation名前空間 URI から XSD ファイルの物理的な場所 (URL) にマップするために使用されます。これは、スキーマの名前空間が有効な XSD URL を指していない場合に使用されます ( MSDN onschemaLocationを参照)。

  • 最後になりましたが、Spring は、インターネット URL を CLASSPATH 上のローカル ファイルに変換する別のレイヤーを追加します。このようにして、インターネットに接続せずに (または springframework.org サイトがダウンしているとき)、アプリケーションを開始できます。

プロジェクト ライブラリを検索すると、spring.schemas. これらのファイルには、次のような行が含まれています ( にあるファイルから抜粋し、spring-context.jar配置を追加しました)。

http\://www.springframework.org/schema/context/spring-context.xsd= org/springframework/context/config/spring-context-3.1.xsd
http\://www.springframework.org/schema/jee/spring-jee.xsd=         org/springframework/ejb/config/spring-jee-3.1.xsd
http\://www.springframework.org/schema/lang/spring-lang.xsd=       org/springframework/scripting/config/spring-lang-3.1.xsd
http\://www.springframework.org/schema/cache/spring-cache.xsd=     org/springframework/cache/config/spring-cache-3.1.xsd
于 2012-05-26T19:02:13.107 に答える