loadBeanDefinitions

org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(String)
从指定的resource location加载bean definitions,location可以为pattern。获取resourceLoader,如果为null抛出BeanDefinitionStoreException异常;如果resourceLoader是ResourcePatternResolver的实例,先通过resourceloader获取resources,loadBeanDefinitions并记录加载的beanDenifitions总数,如果actualResources不为空就把resources都加入到actualResources,然后返回总数。loadBeanDefinitions方法的全路径名为org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(EncodedResource),执行过程如下:
首先,判断reader的resourcesCurrentlyBeingLoaded属性是否为空,如果为空就创建,并将当前处理的encodedResource添加进来,添加失败就抛出BeanDefinitionStoreException。
其次,获取inputStream并用它创建InputSource,设置inputSource的encoding,执行doLoadBeanDefinitions(InputSource, Resource)。doLoadBeanDefinitions方法的执行过程如下:
1 doLoadDocument,Actually load the specified document using the configured DocumentLoader,this.documentLoader.loadDocument(inputSource, getEntityResolver(), this.errorHandler, getValidationModeForResource(resource), isNamespaceAware()):
(1)createDocumentBuilderFactory:DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
(2)createDocumentBuilder:DocumentBuilder docBuilder = factory.newDocumentBuilder();
(3)解析为document:builder.parse(inputSource)
2 registerBeanDefinitions,注册DOM document中包含的BeanDefinitions:
(1)创建BeanDefinitionDocumentReader :
BeanDefinitionDocumentReader documentReader = createBeanDefinitionDocumentReader();
createBeanDefinitionDocumentReader通过cast方法将reader的documentReaderClass属性cast为BeanDefinitionDocumentReader:
BeanDefinitionDocumentReader.class.cast(BeanUtils.instantiateClass(this.documentReaderClass));
(2)记录注册beanDefinition之前的beanDefinitionCount
(3)执行BeanDefinitionDocumentReader的registerBeanDefinitions方法解析beanDefinitions,参数为document和新创建的XmlReaderContext。registerBeanDefinitions再调用doRegisterBeanDefinitions注册element中包含的bean definition。doRegisterBeanDefinitions方法的执行过程如下:
1)这个方法中如果有嵌套beans元素会导致递归调用,为传播和正确保存beans的所有default-*属性、跟踪当前 (parent)代理(可能为null)、回退,创建持有parent代理引用的新的(child) 代理,然后重置this.delegate为原来的 (parent)引用,这种操作模拟了代理栈。新创建的代理为BeanDefinitionParserDelegate。
2)如果为DefaultNamespace,判断element中是否有profile属性,如果有再判断是否为active,如果profile以'!'开头,逻辑相反,profile不为active就return。
3)preProcessXml(root);在开始处理beanDefinition之前可以通过此方法处理自定义element类型。默认为空实现。
4)parseBeanDefinitions(root, this.delegate);解析document中的顶级elements : * "import", "alias", "bean"。遍历elements,如果为默认的命名空间,调用parseDefaultElement(ele, delegate)进行解析;否则调用delegate.parseCustomElement(ele)。
5)postProcessXml(root);在开始处理beanDefinition之后可以通过此方法处理自定义element类型。默认为空实现。
(4)返回新创建的beanDefinitionCount。
最后,关闭inputStream,从resourcesCurrentlyBeingLoaded删除当前处理的encodedResource。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值