为什么在Spring的配置里,最好不要配置xsd文件的版本号
2017-01-05 22:41
579 查看
为什么dubbo启动没有问题?
这篇blog源于一个疑问:我们公司使了阿里的dubbo,但是阿里的开源网站http://code.alibabatech.com,挂掉有好几个月了,为什么我们的应用启动没有问题?
我们的应用的Spring配置文件里有类似的配置:
比如这样的一个Spring配置:
XML的一些概念
首先来看下xml的一些概念:xml的schema里有namespace,可以给它起个别名。比如常见的spring的namespace:
Spring是如何校验XML的
Spring默认在启动时是要加载XSD文件来验证xml文件的,所以如果有的时候断网了,或者一些开源软件切换域名,那么就很容易碰到应用启动不了。我记得当时Oracle收购Sun公司时,遇到过这个情况。为了防止这种情况,Spring提供了一种机制,默认从本地加载XSD文件。打开spring-context-3.2.0.RELEASE.jar,可以看到里面有两个特别的文件:
spring.handlers
spring-context-2.5.xsd
spring-context-3.0.xsd
spring-context-3.1.xsd
spring-context-3.2.xsd
很明显,可以想到Spring是把XSD文件放到本地了,再在spring.schemas里做了一个映射,优先从本地里加载XSD文件。
并且Spring很贴心,把旧版本的XSD文件也全放了。这样可以防止升级了Spring版本,而配置文件里用的还是旧版本的XSD文件,然后断网了,应用启动不了。
我们还可以看到,在没有配置版本号时,用的就是当前版本的XSD文件:
如何跳过Spring的XML校验?
可以用这样的方式来跳过校验:
如何写一个自己的spring xml namespace扩展
可以参考Spring的文档,实际上是相当简单的。只要实现自己的NamespaceHandler,再配置一下spring.handlers和spring.schemas就可以了。http://docs.spring.io/spring/docs/current/spring-framework-reference/html/extensible-xml.html
其它的一些东东
防止XSD加载不成功的一个思路
http://hellojava.info/?p=135
齐全的Spring的namespace的列表
http://stackoverflow.com/questions/11174286/spring-xml-namespaces-how-do-i-find-what-are-the-implementing-classes-behind-t
Spring core
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
Spring Security
security-
SecurityNamespaceHandler
oauth-
OAuthSecurityNamespaceHandler
Spring integration
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
MailNamespaceHandler
redis-
RedisNamespaceHandler
rmi-
RmiNamespaceHandler
script-
ScriptNamespaceHandler
security-
IntegrationSecurityNamespaceHandler
sftp-
SftpNamespaceHandler
stream-
StreamNamespaceHandler
TwitterNamespaceHandler
ws-
WsNamespaceHandler
xml-
IntegrationXmlNamespaceHandler
xmpp-
XmppNamespaceHandler
总结:
为什么不要在Spring的配置里,配置上XSD的版本号?因为如果没有配置版本号,取的就是当前jar里的XSD文件,减少了各种风险。
而且这样约定大于配置的方式很优雅。
参考:
http://stackoverflow.com/questions/10768873/spring-di-applicationcontext-xml-how-exactly-is-xsischemalocation-usedhttp://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
原文出处: hengyunabc
from: http://www.importnew.com/20523.html
相关文章推荐
- 为什么在Spring的配置里,最好不要配置xsd文件的版本号
- 为什么在Spring的配置文件里,最好不要配置xsd文件的版本号
- 为什么在Spring的配置里,最好不要配置xsd文件的版本号
- 为什么在Spring的配置里,最好不要配置xsd文件的版本号
- 为什么在Spring的配置里,最好不要配置xsd文件的版本号
- 为什么在Spring的配置里,最好不要配置xsd文件的版本号
- 为什么在Spring的配置里,最好不要配置xsd文件的版本号
- 为什么在Spring的配置里,最好不要配置xsd文件的版本号
- 为什么在Spring的配置里,最好不要配置xsd文件的版本号
- 为什么在Spring的配置里,最好不要配置xsd文件的版本号
- Spring配置文中解析xsd文件版本
- 为什么不要在Spring的配置里,配置上XSD的版本号
- 关于spring配置文件xsd报错的解决方法
- spring boot jar 打版生产版本 配置文件问题
- spring配置文件xsd报错的解决方法
- XML配置文件中写版本号.xsd和不写版本号的区别
- Springboot属性文件application.properties配置大全,版本:1.5.4
- spring 配置文件XSD地址
- android 横屏竖屏设置的详解(最好不要用Java代码实现,用xml配置文件吧)
- Spring配置文件中属性值不能提示的解决办法(eclipse添加xsd文件)