ode, namespaceAware); if (logger.isDebugEnabled()) {
logger.debug(Using JAXP provider [ + factory.getClass().getName() + ]); }
//创建文档解析器 DocumentBuilder builder = createDocumentBuilder(factory, entityResolver, errorHandler);
//解析Spring的Bean定义资源 return builder.parse(inputSource);
} protected DocumentBuilderFactory createDocumentBuilderFactory(int validationMode, boolean namespaceAware)
throws ParserConfigurationException { //创建文档解析工厂
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); factory.setNamespaceAware(namespaceAware);
//设置解析XML的校验 if (validationMode != XmlValidationModeDetector.VALIDATION_NONE) {
factory.setValidating(true); if (validationMode == XmlValidationModeDetector.VALIDATION_XSD) {
factory.setNamespaceAware(true); try {
factory.setAttribute(SCHEMA_LANGUAGE_ATTRIBUTE, XSD_SCHEMA_LANGUAGE); }
catch (IllegalArgumentException ex) { ParserConfigurationException pcex = new ParserConfigurationException(
Unable to validate using XSD: Your JAXP provider [ + factory + ] does not support XML Schema. Are you running on Java 1.4 with Apache Crimson +
Upgrade to Apache Xerces (or Java 1.5) for full XSD support.); pcex.initCause(ex);
throw pcex; }
} }
return factory; } 该解析过程调用JavaEE标准的JAXP标准进行处理。
至此Spring IoC容器根据定位的Bean定义资源文件,将其加载读入并转换成为Document对象过程完成。
10.看源代码的个人心得总结:
通过这几天看源码,个人总结一些心得:代码毕竟不是文章,不能从头到尾详细看,个人觉得看源码比较好的方法是:
首先,先实现一个简单例子调用源码,让整个应用能简单跑起来。
然后,在进入代码最开始的地方打一个调试断点,使用Debug工具进行单步调试,直到跑完所有流程。
通过调试就可以理解整个代码的工作流程和调用顺序,有助于理清思路,理解其大概的设计思想。
Spring代码的确实比较复杂,代码中大量使用了设计模式,另外为了解耦合,代码的分工比较明确,对象也非常的多,对于没有分析源码经验的人来说,阅读代码发现其跨度和跳转非常大,难度和挑战比较大。
我也是第一次分析Spring源码,希望和大家一起学习探讨。