Springの設定でxsdファイルのバージョン番号を設定しない方が良い理由
なぜダボは問題なく起動するのですか?
このブログは、次のような問いかけから生まれました。
弊社はアリさんのダボを作っていますが、アリさんのオープンソースサイト http://code.alibabatech.com は何ヶ月もハングアップしているのに、なぜ弊社のアプリケーションは問題なく起動するのでしょうか?
私たちのアプリケーションのSpring設定ファイルには、同様の設定があります。
<?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:dubbo="http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
Springが起動時にXMLファイルをチェックしていることは周知の事実です。あるいは、なぜEclipseにxmlのエラーメッセージがないのでしょうか?
例えば、こんなSpringの設定。
<?xml version="1.0" encoding="UTF-8"? >
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd& quot;>
</beans>
また、バージョン番号を付加することもできる。
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0. xsd">
このバージョン番号があるのとないのでは、何が違うのでしょうか?
XMLのいくつかの概念
まず、xmlのいくつかの概念から見ていきましょう。
xmlのスキーマには名前空間があり、その名前空間には別名を付けることができる。例えば、springの共通名前空間。
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
通常、名前空間はXSDが格納されているアドレスであるURIに対応するが、仕様ではこれを要求していない。schemaLocationが提供されない場合、SpringのXMLパーサーは名前空間のURIからXSDファイルをロードする。設定ファイルをこのように変更すれば、問題なく動作します。
<?xml version="1.0" encoding="UTF-8"? >
<beans xmlns="http://www.springframework.org/schema/beans/spring-beans.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
schemaLocationはxmlの名前空間と対応するXSDファイルの対応を提供するので,xsi:schemaLocationの後に設定される文字列は,名前空間のURIが前にあり,xsdファイルのURIが後にある,対になっていることがわかる.
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security.xsd"
SpringがXMLを検証する方法
Springはデフォルトでは起動時にXSDファイルを読み込んでxmlファイルの検証を行うため、インターネットがダウンした時や、オープンソースのソフトウェアがドメインを切り替えた時などに、起動しないアプリケーションに遭遇することがあります。OracleがSunを買収したとき、このような状況に陥ったのを覚えています。
これを防ぐために、SpringはデフォルトでローカルからXSDファイルを読み込む仕組みを提供しています。spring-context-3.2.0.RELEASE.jarを開くと、中に2つの特殊なファイルがあることがわかる。
spring.handlers
http\://www.springframework.org/schema/context=org.springframework.context.config.ContextNamespaceHandler
http\://www.springframework.org/schema/jee=org.springframework.ejb.config.JeeNamespaceHandler
http\://www.springframework.org/schema/lang=org.springframework.scripting.config.LangNamespaceHandler
http\://www.springframework.org/schema/task=org.springframework.scheduling.config.TaskNamespaceHandler
http\://www.springframework.org/schema/cache=org.springframework.cache.config.CacheNamespaceHandler
spring.schemas
http\://www.springframework.org/schema/context/spring-context-2.5.xsd=org/springframework/context/config/spring-context-2.5.xsd
http\://www.springframework.org/schema/context/spring-context-3.0.xsd=org/springframework/context/config/spring-context-3.0.xsd
http\://www.springframework.org/schema/context/spring-context-3.1.xsd=org/springframework/context/config/spring-context-3.1.xsd
http\://www.springframework.org/schema/context/spring-context-3.2.xsd=org/springframework/context/config/spring-context-3.2.xsd
http\://www.springframework.org/schema/context/spring-context.xsd=org/springframework/context/config/spring-context-3.2.xsd
...
次に、jarパッケージ内のorg/springframework/context/config/ディレクトリを開くと、以下のように表示されます。
spring-context-2.5.xsd
春コン3.0.xsd
Spring-context-3.1.xsd
Spring-context-3.2.xsd
明らかに、SpringはXSDファイルをローカルに置き、spring.schemasでマッピングを行い、ローカルから優先的にXSDファイルを読み込むと考えることができます。
そして、Springは親切にも、古いバージョンのXSDファイルもすべて置いておいてくれました。これによって、Springのバージョンをアップグレードして、設定ファイルに古いXSDファイルがあると、接続が切れたときにアプリケーションが起動しなくなるのを防ぐことができます。
また、バージョン番号が設定されていない場合、現在のバージョンの XSD ファイルが使用されることもわかります。
http\://www.springframework.org/schema/context/spring-context.xsd=org/springframework/context/config/spring-context-3.2.xsd
同様に、dubboのjarパッケージを開くと、そのspring.schemasファイルに次のような設定があることがわかります。
http\://code.alibabatech.com/schema/dubbo/dubbo.xsd=META-INF/dubbo.xsd
つまり、Spring は dubbo をロードする際に dubbo jar から dubbo.xsd をロードするのです。
SpringのXMLチェックサムをスキップするには?
チェックサムは、以下の方法でスキップすることができます。
GenericXmlApplicationContext context = new GenericXmlApplicationContext();
context.setValidating(false);
自作のspring xml名前空間拡張の書き方
Springのドキュメントを参照するといいのですが、実はとても簡単です。自分でNamespaceHandlerを実装して、spring.handlersとspring.schemasを設定すればOKです。
http://docs.spring.io/spring/docs/current/spring-framework-reference/html/extensible-xml.html
その他のもの
XSDの読み込みに失敗しないための一工夫
http://hellojava.info/?p=135
Springの名前空間の完全なリスト
http://stackoverflow.com/questions/11174286/spring-xml-namespaces-how-do-i-find-what-are-the-implementing-classes-behind-t
スプリングコア
-
aop
-AopNamespaceHandler c
-
-
SimpleConstructorNamespaceHandler cache
-
-
CacheNamespaceHandler context
-
-
ContextNamespaceHandler jdbc
-
-
JdbcNamespaceHandler jee
-
-
JeeNamespaceHandler jms
-
-
JmsNamespaceHandler lang
-
-
LangNamespaceHandler mvc
-
-
MvcNamespaceHandler oxm
-
-
OxmNamespaceHandler p
-
-
SimplePropertyNamespaceHandler task
-
-
TaskNamespaceHandler tx
-
-
TxNamespaceHandler util
-
-
UtilNamespaceHandler
春のセキュリティ
-
security SecurityNamespaceHandler oauth
-
-
OAuthSecurityNamespaceHandler
Springとの連携
-
int
-IntegrationNamespaceHandler amqp
-
-
AmqpNamespaceHandler event
-
-
EventNamespaceHandler feed
-
-
FeedNamespaceHandler file
-
-
FileNamespaceHandler ftp
-
-
FtpNamespaceHandler gemfire
-
-
GemfireIntegrationNamespaceHandler groovy
-
-
GroovyNamespaceHandler http
-
-
HttpNamespaceHandler ip
-
-
IpNamespaceHandler jdbc
-
-
JdbcNamespaceHandler jms
-
-
JmsNamespaceHandler jmx
-
-
JmxNamespaceHandler mail
-
-
MailNamespaceHandler redis
-
-
RedisNamespaceHandler rmi
-
-
RmiNamespaceHandler script
-
-
ScriptNamespaceHandler security
-
-
IntegrationSecurityNamespaceHandler sftp
-
-
SftpNamespaceHandler stream
-
-
StreamNamespaceHandler twitter
-
-
TwitterNamespaceHandler ws
-
-
WsNamespaceHandler xml
-
-
IntegrationXmlNamespaceHandler xmpp
-
-
XmppNamespaceHandler
概要
Springの設定でXSDのバージョン番号を設定しないのはなぜですか?
なぜなら、バージョン番号が設定されていない場合、現在の jar にある XSD ファイルが取得されるため、あらゆるリスクが軽減されるからです。
そして、これは設定以上のことに合意するためのエレガントな方法です。
参考
http://stackoverflow.com/questions/10768873/spring-di-applicationcontext-xml-how-exactly-is-xsischemalocation-used
http://stackoverflow.com/questions/11174286/spring-xml-namespaces-how-do-i-find-what-are-the-implementing-classes-behind-t
http://docs.spring.io/spring/docs/current/spring-framework-reference/html/extensible-xml.html
公共
パブリックナンバーへようこそ。Java、Spring Boot、Arthas、Dubboの共有を中心とした、Cross Cloud Broken Ridgeのコラムです。
関連
-
型に解決できない エラー解決
-
スレッド "main" での例外 java.lang.ArrayIndexOutOfBoundsException:5 エラー
-
JAVA_HOME環境変数が正しく定義されていない問題を解決する
-
名前 'XXX' を持つ Bean の作成に失敗しました。自動依存関係の注入に失敗しました 解決方法
-
Javaジェネリックを1つの記事で
-
セミコロン期待値エラー解決
-
API の戻り値を処理するために ResponseEntity を使用する
-
Javaがリソースリークに遭遇した:'input'が閉じない 解決方法
-
代入の左辺は変数でなければならない 解答
-
ecplise プロンプトが表示されます。"選択したものは起動できません。" "最近の起動はありません。"
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
スレッド "main "での例外 java.util.NoSuchElementException in Java 問題解決済み
-
アクセス制限です。タイプ 'Application' は API ではない(必要なライブラリに制限がある)。
-
Java の switch case 文で必要な定数式の問題の解決法
-
が 'X-Frame-Options' を 'sameorigin' に設定したため、フレーム内に存在する。
-
強制型変換について
-
無効なメソッド宣言
-
java.sql.SQLException: 結果セットの開始前
-
CertificateException: XXXに一致するサブジェクトの代替DNS名が見つかりません 解決策
-
JNIエンカウンターエラー:構造体またはユニオンではない何かでメンバー 'FindClass' のリクエスト
-
WeChat小プログラム Bluetooth通信 Bluetoothモジュールデモ