Spring Bean加载流程分析(通过 XML 方式加载)( 四 )
该方法的主要功能是为了从指定的 Resource 文件中加载 BeanDefinition , 该方法的返回值是返回 BeanDefinition 的数量 。 此处 Spring 将传入的 Resource 对象封装成了一个 EncodedResource 对象 。 顾名思义我们知道该对象只是对 Resource 进行了封装 , 其中除了包含指定的 Resource 资源外 , 还包含了编码信息 , 进入 EncodedResource 源码看看 。
public EncodedResource(Resource resource) {this(resource, null, null);}public EncodedResource(Resource resource, @Nullable String encoding) {this(resource, encoding, null);}public EncodedResource(Resource resource, @Nullable Charset charset) {this(resource, null, charset);}/** * 私有构造方法 **/private EncodedResource(Resource resource, @Nullable String encoding, @Nullable Charset charset) {super();Assert.notNull(resource, "Resource must not be null");this.resource = resource;this.encoding = encoding;this.charset = charset;}复制代码
可以看到 , Charset 和 encoding 是互斥的属性 。 显然我们这里仅仅只传入了 Resource 对象 , 那么默认的 encoding 了 charset 均为空 。
接下来看看 loadBeanDefinitions(EncodedResource e) 的具体实现 。
public int loadBeanDefinitions(EncodedResource encodedResource) throws BeanDefinitionStoreException {// .... 省略无效代码Set
resourcesCurrentlyBeingLoaded 是一个 ThreadLocal 对象 , 首先先从 resourcesCurrentlyBeingLoaded 中获取当前的 encodedResource , 如果获取出来的为空 , 则初始化一个 new HashSet
很显然这里面造成了一个循环引用 , 执行至此必然会抛出异常 。
文章插图
这里使用了一种巧妙的方式 , 通过 Set 集合不能有重复数据的特性来判断 applicationContext.xml 文件中的定义是否出现了循环导入 。
- 文件系统(02):基于SpringBoot管理Xml和CSV
- SpringBoot2.x入门到项目实战课程系列(第二章)
- SpringBoot集成Mybatis
- 大牛深入解析SpringBoot核心运行原理和运作原理源码
- SpringBoot写后端接口,看这一篇就够了
- 9款游戏13块SSD:测试固态硬盘对游戏加载速度影响有多大?
- Spring Boot 中 @EnableX 注解的驱动逻辑
- SpringBoot2.x入门到项目实战课程系列(第五章)
- SpringBoot整合JWT+Shiro
- 14 个 SpringMVC顶级技巧,随时用随时爽