- 浏览: 270788 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
hongxingyaru_d5b032:
但是其中“这个Accept和Request Headers中的 ...
基于Spring MVC的Web应用开发(7) - Headers -
hongxingyaru_d5b032:
学习到了,感谢分享!
基于Spring MVC的Web应用开发(7) - Headers -
bo_hai:
总结的不错。
基于Spring MVC的Web应用开发(7) - Headers -
fendou3754:
那你也说一下spring-asm重新打包以后的源码怎么获取,尽 ...
spring将spring-asm重新打包原因 -
di1984HIT:
谢谢啊~学习了~~
JMS、AMQP实例讲解
最近在研究Spring源代码,在梳理spring-beans时故意只保留org.springframework.beans.factory.xml包下的xsd的3.1版本,然后在看Reference时,上面有一个简单的XML配置文件,如下
<?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-3.0.xsd"> <!-- beans --> </beans>
注意到这是一个3.0的xsd,然后测试时发现依然可以正常,只是变慢了,有时甚至卡住了,于是怀疑Spring底层代码访问了网址http://www.springframework.org/schema/beans/spring-beans-3.0.xsd,然后将返回的结果作为校验xml的xsd。
抽取了一部分ClassPathXmlApplicationContext加载过程的代码,仅仅解析XML配置文件,代码如下:
package test.temp; import java.io.InputStream; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.beans.factory.xml.DefaultDocumentLoader; import org.springframework.beans.factory.xml.DelegatingEntityResolver; import org.springframework.beans.factory.xml.DocumentLoader; import org.springframework.core.io.Resource; import org.springframework.core.io.support.EncodedResource; import org.springframework.core.io.support.PathMatchingResourcePatternResolver; import org.springframework.core.io.support.ResourcePatternResolver; import org.springframework.util.xml.SimpleSaxErrorHandler; import org.w3c.dom.Document; import org.xml.sax.EntityResolver; import org.xml.sax.ErrorHandler; import org.xml.sax.InputSource; public class Test2 { private static Log logger = LogFactory.getLog(Test2.class); public static void main(String[] args) throws Exception { String location = "a/a1.xml"; // // DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory(null); // XmlBeanDefinitionReader beanDefinitionReader = new XmlBeanDefinitionReader(beanFactory); // int counter = beanDefinitionReader.loadBeanDefinitions(location, null); // ResourcePatternResolver resourceLoader = new PathMatchingResourcePatternResolver(); Resource[] resources = ((ResourcePatternResolver) resourceLoader).getResources(location); for (Resource r : resources) { EncodedResource encodedResource = new EncodedResource(r); InputStream inputStream = encodedResource.getResource().getInputStream(); InputSource inputSource = new InputSource(inputStream); // Resource resource = encodedResource.getResource(); // // Key 2 EntityResolver entityResolver = new DelegatingEntityResolver(null); ErrorHandler errorHandler = new SimpleSaxErrorHandler(logger); System.out.println("begin"); DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); factory.setValidating(true); // Key 1 factory.setNamespaceAware(true); factory.setAttribute("http://java.sun.com/xml/jaxp/properties/schemaLanguage", "http://www.w3.org/2001/XMLSchema"); if (logger.isDebugEnabled()) { logger.debug("Using JAXP provider [" + factory.getClass().getName() + "]"); } System.out.println("waiting..."); DocumentBuilder docBuilder = factory.newDocumentBuilder(); if (entityResolver != null) { docBuilder.setEntityResolver(entityResolver); } if (errorHandler != null) { docBuilder.setErrorHandler(errorHandler); } System.out.println("builder:[" + docBuilder + "]"); // FIMXE Document document = docBuilder.parse(inputSource); /* DocumentLoader documentLoader = new DefaultDocumentLoader(); Document doc = documentLoader.loadDocument( inputSource, entityResolver, errorHandler, 3, false); */ System.out.println("end"); } } }
然后就开始一段痛苦而又折磨人的DEBUG之旅,使用Eclipse,设置端点,Spring使用SAX解析XML,SAX底层代码很复杂,调用极多,所以我就在F5,F6之间迷失了...还好,最终定位到
package com.sun.org.apache.xerces.internal.impl;
...
public class XMLDocumentScannerImpl
extends XMLDocumentFragmentScannerImpl{
...
public void setInputSource(XMLInputSource inputSource) throws IOException {
fEntityManager.setEntityHandler(this);
//this starts a new entity and sets the current entity to the document entity.
fEntityManager.startDocumentEntity(inputSource);
// fDocumentSystemId = fEntityManager.expandSystemId(inputSource.getSystemId());
setScannerState(XMLEvent.START_DOCUMENT);
} // setInputSource(XMLInputSource)
和
package com.sun.org.apache.xerces.internal.impl ;
...
public class XMLEntityManager implements XMLComponent, XMLEntityResolver {
...
public String setupCurrentEntity(String name, XMLInputSource xmlInputSource,
boolean literal, boolean isExternal)
throws IOException, XNIException {
// get information
final String publicId = xmlInputSource.getPublicId();
String literalSystemId = xmlInputSource.getSystemId();
String baseSystemId = xmlInputSource.getBaseSystemId();
String encoding = xmlInputSource.getEncoding();
final boolean encodingExternallySpecified = (encoding != null);
Boolean isBigEndian = null;
// create reader
InputStream stream = null;
Reader reader = xmlInputSource.getCharacterStream();
// First chance checking strict URI
String expandedSystemId = expandSystemId(literalSystemId, baseSystemId, fStrictURI);
if (baseSystemId == null) {
baseSystemId = expandedSystemId;
}
if (reader == null) {
stream = xmlInputSource.getByteStream();
if (stream == null) {
URL location = new URL(expandedSystemId);
URLConnection connect = location.openConnection();
if (!(connect instanceof HttpURLConnection)) {
stream = connect.getInputStream();
}
else {
boolean followRedirects = true;
// setup URLConnection if we have an HTTPInputSource
if (xmlInputSource instanceof HTTPInputSource) {
final HttpURLConnection urlConnection = (HttpURLConnection) connect;
final HTTPInputSource httpInputSource = (HTTPInputSource) xmlInputSource;
// set request properties
Iterator propIter = httpInputSource.getHTTPRequestProperties();
while (propIter.hasNext()) {
Map.Entry entry = (Map.Entry) propIter.next();
urlConnection.setRequestProperty((String) entry.getKey(), (String) entry.getValue());
}
// set preference for redirection
followRedirects = httpInputSource.getFollowHTTPRedirects();
if (!followRedirects) {
setInstanceFollowRedirects(urlConnection, followRedirects);
}
}
stream = connect.getInputStream();
// REVISIT: If the URLConnection has external encoding
// information, we should be reading it here. It's located
// in the charset parameter of Content-Type. -- mrglavas
if (followRedirects) {
String redirect = connect.getURL().toString();
// E43: Check if the URL was redirected, and then
// update literal and expanded system IDs if needed.
if (!redirect.equals(expandedSystemId)) {
literalSystemId = redirect;
expandedSystemId = redirect;
}
}
}
}
...
总算是验证的我的猜想 :)
另外在还在频繁的debug中发现,拔网线会产生异常,但抛出的异常并不是想象中的IOException,而是经过包装后的,乍一看是不知道网络连接失败导致的。
再另,如果classpath下有3.0的xsd,Spring就会直接使用它。
发表评论
-
《Pro Spring Integration》读书笔记
2012-06-02 11:30 0a -
基于Spring MVC的Web应用开发(12) - Form
2012-03-31 14:50 5977本节介绍SpringMVC中的表单,demo演示访问一个表单提 ... -
基于Spring MVC的Web应用开发(11) - Views
2012-03-31 13:13 8804在FileUpload一文中,我们初步了解了SpringMVC ... -
基于Spring MVC的Web应用开发(10) - Validation
2012-03-31 11:36 3175本文介绍SpringMVC的验证(validation),在C ... -
基于Spring MVC的Web应用开发(9) - Exceptions
2012-03-31 10:55 1769本文介绍SpringMVC中的异常处理,@Controller ... -
基于Spring MVC的Web应用开发(8) - Convert
2012-03-31 09:25 3680本文介绍SpringMVC中的Convert,Convert是 ... -
基于Spring MVC的Web应用开发(7) - Headers
2012-03-30 15:01 27364本文接上一篇文章,介 ... -
基于Spring MVC的Web应用开发(6) - Response
2012-03-30 10:56 36096本文讲解Spring MVC的Response,深入了解一下@ ... -
基于Spring MVC的Web应用开发(5) - Redirect
2012-03-26 15:10 17542本文介绍Spring MVC中的重定向(Redirect),先 ... -
基于Spring MVC的Web应用开发(4) - FileUpload
2012-03-20 21:17 35763上一篇文章介绍了Spring MVC如何处理静态资源文件,本文 ... -
基于Spring MVC的Web应用开发(3) - Resources
2012-03-20 16:22 6615上一篇介绍了在基于Spring MVC的Web项目中加入日志, ... -
基于Spring MVC的Web应用开发(2) - Log
2012-03-19 11:55 3593上一篇文章我们使用SpringMVC搭建了一个简单WEB项目 ... -
基于Spring MVC的Web应用开发(1) - HelloWorld
2012-03-16 07:21 18290MVC架构 MVC是模型(model),视图(view),控 ... -
spring-oxm中unmashaller疑似bug
2012-03-08 10:21 2558spring-integration中测试XML Transf ... -
spring将spring-asm重新打包原因
2012-03-06 13:41 8283以前就发现通过eclipse上面的m2e插件不能将spring ... -
在Spring 3.1.0 M2中配置Hibernate事务失效?
2011-10-22 00:38 2192SpringSource与2011年6月8号发布了Spring ...
相关推荐
在解析XML文件时,我们需要实现一个XML解析器,如SAX或DOM解析器,来读取bean的定义。对于每个`<bean>`标签,我们需要收集id、class属性以及任何`<property>`或`<constructor-arg>`标签。 解析完成后,我们需要创建...
XML(eXtensible Markup Language)是一种用于标记数据的语言,广泛应用于数据交换、配置文件以及文档存储等领域。在Java开发中,处理XML文件通常需要借助特定的库来完成解析和生成工作。本话题将深入探讨Java中使用...
"春使用OXM进行对象XML映射解析" 春框架中使用OXM(Object-XML Mapping)对对象进行XML映射解析,具有一定...春框架中使用OXM对对象进行XML映射解析,需要了解XML相关概念和处理技术,以及XStream框架的使用和配置。
2. **SAX解析**:Simple API for XML (SAX) 是一种基于事件驱动的解析方式,适合处理大型XML文件。在Java中,`org.xml.sax`包提供了相关的接口和类,如`Parser`、`ContentHandler`等,用于处理XML流,它不创建完整的...
- 配置文件:Spring框架中的bean配置、Log4j日志配置等都采用XML格式。 - 数据交换:不同系统间的数据传输,如EAI(Enterprise Application Integration)项目。 6. 学习与进阶 掌握XML框架,不仅需要理解XML的...
1. **Web开发**: 在Servlet和JSP中,DOM4J可以帮助解析XML配置文件,如Web应用的web.xml。 2. **ORM框架**: Hibernate等对象关系映射框架使用DOM4J解析和生成XML映射文件。 3. **数据交换**: 在分布式系统中,DOM4...
例如,Spring框架的配置文件就是XML格式,引入JDOM-1.0.jar可以方便地进行配置文件的动态读取和修改。此外,XML也常作为RESTful API的数据载体,JDOM可以帮助开发者轻松地解析和生成响应数据。 值得注意的是,虽然...
学习如何使用Spring JDBC模块进行数据库操作,以及如何结合XML配置文件进行配置。 7. **JPA(Java Persistence API)和Hibernate**:虽然不是直接与JDBC和XML相关的,但JPA是Java EE中用于对象-关系映射的规范,而...
4. **集成性**:DOM4J与Spring、Hibernate等框架有很好的集成,可以方便地在这些框架中使用DOM4J进行XML配置文件的处理。 5. **性能优化**:DOM4J针对大量XML处理进行了优化,例如,它的Document对象可以被序列化和...
- **Spring框架**:Spring的bean配置文件通常使用XML格式,DOM4J可以帮助解析和构建bean实例。 - **Struts框架**:Struts的action配置、result配置等也是XML,DOM4J可以方便地读取和操作这些配置。 - **Web服务**...
- **Web开发**:在Java Web应用程序中,DOM4J常用于处理XML配置文件,如Spring的配置文件。 - **数据交换**:XML作为一种数据交换格式,DOM4J可以方便地将数据转换为XML,便于不同系统间的通信。 - **XML文档生成...
DOM4J被广泛应用于Spring框架中,用于配置文件的解析,使得我们可以使用XML来声明和配置bean及其依赖关系。 通过研究DOM4J的源码,我们可以更好地理解XML处理的底层机制,提高我们在实际项目中处理XML文档的能力。...
1. **解析XML**:JDOM提供了两种方式来解析XML文档:SAX(Simple API for XML)和DOM(Document Object Model)。SAX是一种事件驱动的解析方法,适合处理大型XML文件,而DOM则将整个XML文档加载到内存,适合小型文件...
5. **与Spring框架的集成**:DOM4J被广泛应用于Spring框架中,用于配置文件的解析和构建。 **DOM4J的使用方法:** 1. **解析XML**:DOM4J提供了`Document`类,可以解析XML文档为一个对象模型。通过`...
5. **性能优化**:尽管XMLBeans提供了一种直观的编程模型,但需要注意的是,对于大规模的XML数据处理,其性能可能不如直接使用DOM或SAX解析器。因此,在性能敏感的场景下,可能需要权衡使用哪种方式。 6. **集成与...
DOM4J则常用于处理配置文件,比如Hibernate的配置文件或XML映射文件(.hbm.xml),提供了便捷的方式来读取、解析和修改这些文件。 这两个库的结合使得开发者能够更高效地构建数据驱动的应用程序,通过DOM4J处理XML...
XML(Extensible Markup Language)是一种标记语言,常用于数据交换、配置文件等。在Java中,XML处理涉及到几个关键API,如DOM(Document Object Model)、SAX(Simple API for XML)和StAX(Streaming API for XML...
4. **XML(eXtensible Markup Language)**:XML是一种用于标记数据的语言,常用于数据交换和配置文件。资料中提及了XML的处理方法,这可能包括DOM(Document Object Model)、SAX(Simple API for XML)和StAX...
Java的Properties类和Spring框架的XML配置文件是典型例子。 3. 文档存储:XML可用于持久化数据,如存储报表、日志等。Java的JAXB框架可以实现XML与Java对象之间的双向绑定。 二、Java系统源码学习 深入理解Java...