,接下来会先分析面向资源(XML、Properties)这种方式 Spring 是如何处理的 下来熟悉一段代码: dependency-lookup-context.xml: <?...如果已存在,抛出异常,防止循环加载同一资源出现死循环 throw new BeanDefinitionStoreException( "Detected...DTD 是一种保证 XML 文档格式正确的有效验证方式,它定义了相关 XML 文档的元素、属性、排列方式、元素的内容类型以及元素的层次结构。...DTD 文档 DTD 对元素的类型限制较少;同时其他的约束力也比较弱 DTD 扩展能力较差 基于正则表达式的 DTD 文档的描述能力有限 XSD(XML Schemas Definition),即 XML...XML Schema 本身就是一个 XML 文档,使用的是 XML 语法,因此可以很方便的解析 XSD 文档。
这篇博客主要分析获取 xml 文件的验证模式。...DTD 是一种保证 XML 文档格式正确的有效验证方式,它定义了相关 XML 文档的元素、属性、排列方式、元素的内容类型以及元素的层次结构。...其实 DTD 就相当于 XML 中的 “词汇”和“语法”,我们可以通过比较 XML 文件和 DTD 文件 来看文档是否符合规范,元素和标签使用是否正确。...XML Schema 本身就是一个 XML文档,使用的是 XML 语法,因此可以很方便的解析 XSD 文档。...好了,XML 文件的验证模式分析完毕,下篇分析 doLoadBeanDefinitions() 的第二个步骤:获取 Document 实例。
} default boolean isOpen() { return false; } default boolean isFile() { return false; } URL...throws BeanDefinitionStoreException; } Spring配置文件可以有不同的描述方式,如xml、properties等,根据不同的描述类型,有不同的实现类,如XmlBeanDefinitionReader...; } try { //从Resource中获取InputStream并构造InputSource InputStream...{ try { //将封装了Spring配置文件的Resource对象解析成Document文档对象 Document doc = doLoadDocument...document from " + resource, ex); } } 不考虑异常处理,doLoadBeanDefinitions()方法其实只完成了两件事: 将资源解析成Document对象
xsd规范校验 创建文档构建器 使用jaxp解析器解析xml并返回Document对象 //DefaultDocumentLoader.class @Override public Document loadDocument...并返回Document对象 return builder.parse(inputSource); } 至此,xml已经解析完成,下面就是从文档对象中取出bean相关的数据并组装成BeanDefinition...存入BeanDefinitionMap中 小总结 简单来说,解析xml其实就是调用jaxp的api进行解析,解析完成后返回一个文档对象,然后根据规则来取出数据并组装,就这么简单。...beanName); } else if (isConfigurationFrozen()) { clearByTypeCache(); } } 至此,我们就完成了从文档对象中取出...BeanDefinition 发布注册事件 最后总结 基本上就以下几点 使用jaxp 解析器来解析xml,返回Document对象(ps:不知道jaxp解析器的可自行百度了解一下) 解析文档对象组装BeanDefintionHolder
Resource 进入源码追踪 XmlBeanFactory的构造函数 loadBeanDefinitions---加载Bean doLoadBeanDefinitions---真正将bean的定义信息从xml...isOpen() { return false; } default boolean isFile() { return false; } URL...Loaded " + count + " bean definitions from " + resource); } return count; }....全都是catch--当然这里抛出的异常也非常重要...: 拿到XML文档的类型,是DTD还是XSD 如果不清楚啥是DTD和XSD可以自行了解一下,这里感兴趣可以去自己翻阅源码看一下大概的思路 使用XML解析器对xml文档进行解析,这里感兴趣的小伙伴可以自行去了解一下解析过程...,不感星球的小伙伴,只需要知道这里会读取xml文档,并按照xml解析方法将xml文件解析映射到Document对象上 ---- ---- registerBeanDefinitions—解析并注册
BeanDefinitionReader 这是一个接口,从名字上就能看出来专门用来读取 BeanDefinition,接口如下: public interface BeanDefinitionReader...beanName,这个松哥在最近录制的 Spring 源码分析视频中已经详细分析过了,这里就不再啰嗦了。...文件,首先会尝试将当前的要解析的 encodedResource 加入到 currentResources 集合中,如果加不进去,说明当前的 encodedResource 正在处理中,那么就抛出异常...Document 就是 XML 解析时获取到的文档对象,Document 对象代表了一个 XML 文档的模型树,所有的其他 Node 都以一定的顺序包含在 Document 对象之内,排列成一个树状结构...,以后对 XML 文档的所有操作都与解析器无关,直接在这个 Document 对象上进行操作即可。
(Reported by Dustin Woods.) // 为了避免应用程序在WebLogic 8.1关闭时出现类异常加载问题,加载IOC容器关闭时间(ContextClosedEvent...资源文件时,启用Xml的校验机制 initBeanDefinitionReader(beanDefinitionReader); // Bean 读取器真正实现加载的方法...从对AbstractBeanDefinitionReader的loadBeanDefinitions方法源码分析可以看出该方法做了一下两件事 首先,调用资源加载器的获取资源方法resourceLoader.getResource...... // 如果URL方式,使用UrlResource作为bean文件的资源对象 URL url = new URL(location)...解析载入的Bean定义资源文件 XmlBeanDefinitionReader类中的doLoadBeanDefinitions方法是从特定的XML文件中实际载入bean定义资源的方法,该方法在载入bean
支持文件和 URL 的形式,实现 WritableResource 接口,且从 Spring Framework 5.0 开始,FileSystemResource 使用 NIO2 API进行读/写交互...UrlResource :对 java.net.URL类型资源的封装。内部委派 URL 进行具体的资源操作。...从Resource中获取对应的InputStream并构造InputSource。...; } //从encodedResource中获取已经封装的Resource对象,并再次从Resource中获取其中的inputStream try (InputStream inputStream...exception parsing XML document from " + resource, ex); } } 3 注册 BeanDefinition 流程 分析上一节的registerBeanDefinitions
在这里需要注意的一点是这个过程并没有完成依赖注入,依赖注册是发生在应用第一次调用 getBean() 向容器索要 Bean 时。...资源定位在前面已经分析了,下面我们直接分析加载,上面提过 reader.loadBeanDefinitions(resource) 才是加载资源的真正实现,所以我们直接从该方法入手。...loadBeanDefinitions(new EncodedResource(resource)); } 从指定的 xml 文件加载 Bean Definition,这里会先对 Resource...异常。...方法 doLoadBeanDefinitions() 为从 xml 文件中加载 Bean Definition 的真正逻辑,如下: protected int doLoadBeanDefinitions
DefaultListableBeanFactory:综合上面所有功能,主要是对Bean注册后的处理 XmlBeanFactory对DefaultListableBeanFactory进行了扩展,主要用于从xml...文档中读取BeanDefinition。...catch (Throwable ex) { // Cannot access thread context ClassLoader - falling back... // 只是不让异常抛出...的实现类中的BeanFactory依赖在自动装配时被忽略,而统一由框架设置依赖 // 如ApplicationContextAware接口的设置会在ApplicationContextAwareProcessor...resource, @Nullable String encoding, @Nullable Charset charset) { super(); // object类的构造函数,之前在Object的源码分析的时候看过了
进行xml 件的读取,从每个堆栈中读取程序的运行信息 4.注意:由于Spring的类继承体系比较复杂,不能全部贴图,所以只将分析源码之后发现的最主要的类继承结构类图贴在下方。...首先是BeanDefinitionReader,将XML文件读取成w3c的Document文档。...bean.xml的处理 ---- 从整体上介绍完了流程,接下来就重点看obtainFreshBeanFactory()方法,上文说到,在这个方法里,完成了配置文件的加载、解析、注册 protected..."Unexpected exception parsing XML document from " + resource, ex); } } 抛开异常处理:核心代码如下: Document...文档),BeanDefinitionDocumentReader(依赖xml文档,进行解析和注册),BeanDefinitionParserDelegate(实际的解析工作)。
前言 由于记录的是 Spring源码分析的过程,详细用法就不一一赘述了 核心代码 org.springframework...那么 Spring 在获取属性 A 时,如果发现属性 B 未实例化则会自动实例化属性 B,这也是 Spring中提供的一个重要特性,在某些情况下 B 不会被初始化,比如实现了 BeanNameAware...资源管理 通过 Resource 接口来实现对 File、URL、Classpath 等资源的管理, Resource 负责对配置文件进行读取,即将配置文件封装为 Resource,然后交给 XmlBeanDefinitionReader...跟踪 reader.loadBeanDefinitions(resource);,我们可以见到如下 核心代码(剔除注释和抛出异常) public int loadBeanDefinitions(EncodedResource...也就是说,对于解析一个 xml,sax 首先会读取该 xml 文档上的声明,根据声明去寻找相应的 DTD 定义,以便对文档的进行验证,默认的寻找规则,(即:网络下载,通过 XML 声明的 DTD URI
这是维基百科的说法,楼主按照自己的思路分析一下IOC,楼主认为,分析一个问题,或者说证明一个事情,有2种方法,一是正向验证,即按照该事物的逻辑去验证正确性,还有一种是反向验证,证明该事物是否正确。...release 版本至今已经到了 5.0.3,和最初的 interface21 已经有了翻天复地的变化,现在也有了springboot, springcloud,俨然一个庞大的spring家族,想分析源码的我们该从哪里下手呢...parsing XML document from " + resource, ex); } } 可以看出该方法主要逻辑是根据输入流加载 Document 文档对象,然后根据得到的文档对象注册到容器...该方法最后从文档对象获取根元素,最后调用 DefaultBeanDefinitionDocumentReader.doRegisterBeanDefinitions(root) 进行注册。...ele, ex); } finally { this.parseState.pop(); } return null; } 我们看看该方法,可以看到,该方法从XML
在上一篇 Spring从入门到精通(一)—-IoC(控制反转) 中,详细的介绍了IOC的基本原理,本篇博客就不再赘述;这次主要是从源码的角度来给大家分享SpringIOC的初始化过程。...容器的具体的过程都在这一句话上(后台很硬的~_~): BeanFactory factory = new ClassPathXmlApplicationContext("applicationContext.xml..."cancelling refresh attempt: " + ex); } // 为防止Bean资源占用,在异常处理中...URL url = new URL(location); return new UrlResource(url); } catch...参考资料: spring技术内幕–深入解析Spring架构与设计原理 深入分析Java Web技术内幕 Spring:源码解读Spring IOC原理
这是维基百科的说法,楼主按照自己的思路分析一下IOC,楼主认为,分析一个问题,或者说证明一个事情,有2种方法,一是正向验证,即按照该事务的逻辑去验证正确性,还有一种是反向验证,证明该事务是否正确。...release 版本至今已经到了 5.0.3,和最初的 interface21 已经有了翻天复地的变化,现在也有了springboot, springcloud,俨然一个庞大的spring家族,想分析源码的我们该从哪里下手呢...parsing XML document from " + resource, ex); } } 可以看出该方法主要逻辑是根据输入流加载 Document 文档对象,然后根据得到的文档对象注册到容器...该方法最后从文档对象获取根元素,最后调用 DefaultBeanDefinitionDocumentReader.doRegisterBeanDefinitions(root) 进行注册。...ele, ex); } finally { this.parseState.pop(); } return null; } 我们看看该方法,可以看到,该方法从XML
文档被解析成DOM树,其中Document是整个DOM的根节点,root为根元素,由根元素一层一层向下解析element元素,容器启动解析XML流程就是这样。...XmlBeanFactory启动流程分析 XmlBeanFactory容器启动就两行代码 ClassPathResource resource = new ClassPathResource("spring-config.xml...{ // 把从XML文件读取的Resource资源进行编码处理 return loadBeanDefinitions(new EncodedResource(resource)); } /...返回的bdHolder不为空时,标签元素如果有自定义属性和自定义子节点,还需要再次对以上两个标签解析。具体逻辑参考4.2小节源码。...使用DefaultBeanDefinitionDocumentReader读取器从Document对象解析出 Element。
下面分析FileSystemXmlApplicationContext的超类AbstractApplicationContext中的refresh()方法: @Override public void...resource pattern [" + location + "]", ex); } } else { // Can only load single resources by absolute URL...XML document from " + resource, ex); } catch (Throwable ex) { throw new BeanDefinitionStoreException...Document 文档对象,然后根据得到的文档对象,将定义的Bean注册到容器,调用 registerBeanDefinitions(doc, resource);进行注册,registerBeanDefinitions...选择processBeanDefinition(ele, delegate);方法进行分析: /** * Process the given bean element, parsing the bean
@DependenOn注解 @Nullable private String[] dependsOn; // autowire-candidate属性设置为false,这样容器在查找自动装配对象时,...自动装配的候选者, // 但是该bean本身还是可以使用自动装配来注入其他bean的 private boolean autowireCandidate = true; // 自动装配时出现多个...bean候选者时,将作为首选者,对应bean属性primary,以及@Primary注解 private boolean primary = false; // 用于记录Qualifier,对应子元素...EncodedResource>(4); this.resourcesCurrentlyBeingLoaded.set(currentResources); } // 2.如果相互引用了就报异常了...NAME_ATTRIBUTE); String alias = ele.getAttribute(ALIAS_ATTRIBUTE); // 校验name属性,如果是空的,就会在error方法中抛出异常
DTO是一种保证XML文档格式正确的有效方法,可以通过比较XML文档和DTO文件来看文档是否符合规范,元素和标签使用是否正确,一个DTO文档包含:元素的定义规则,元素间关系的定义规则,元素可以使用的属性...XML Schema描述了XML文档的结构,可以用一个指定的XML Schema来验证某个XML文档,以检查该XML文档是否符合其要求,文档设计者可以通过XML Schema指定一个XML文档所允许的结构和内容...,并可根据此来检查一个XML文档是否有效。...XML,它包含两个部分: 一部分是名称空间的URL 另外一部分就是该名称空间所标识的XML Schema文件位置或URL地址(xsi:schemaLocation="http://www.springframework.org...return VALIDATION_AUTO; } } 源码分析 从源码中我们可以看到,主要是通过读取XML文件的内容,判断内容中是否包含有DOCTYPE ,如果是则为DTD,否则为XSD,当然只会读取到第一个
Document 就是 XML 解析时获取到的文档对象,Document 对象代表了一个 XML 文档的模型树,所有的其他 Node 都以一定的顺序包含在 Document 对象之内,排列成一个树状结构...,以后对 XML 文档的所有操作都与解析器无关,直接在这个 Document 对象上进行操作即可。...将 XML 配置文件的 IO 流转为一个 InputSource 对象,InputSource 是 XML 文件解析的起点,XML 文件解析这块大家自己复习下,松哥就不做过多介绍了。...最后从集合中移除资源。...IOException parsing XML document from " + resource, ex); } catch (Throwable ex) { throw new BeanDefinitionStoreException
领取专属 10元无门槛券
手把手带您无忧上云