本文主要介绍xml被解析到IOC容器中的过程
主要分为四步
- io流读取xml文件,生成InputSource对象
- documentLoader读取InputSource对象,转为Document
- NamespaceHandle解析Document成BeanDefinition
- 将beanDefinition放到容器中(beanDefinitionMap和beanDefinitionNames)
下面把部分代码(核心代码)贴出来
第一步 (XmlBeanDefinitionReader类下的loadBeanDefinitions方法)
复制代码
1
2
3
4
5
6
7
8
9
10
11public int loadBeanDefinitions(EncodedResource encodedResource) throws BeanDefinitionStoreException { try (InputStream inputStream = encodedResource.getResource().getInputStream()) { InputSource inputSource = new InputSource(inputStream); if (encodedResource.getEncoding() != null) { inputSource.setEncoding(encodedResource.getEncoding()); } return doLoadBeanDefinitions(inputSource, encodedResource.getResource()); } }
第二步 (XmlBeanDefinitionReader类下的doLoadBeanDefinitions方法)
复制代码
1
2
3
4
5
6
7
8
9
10
11protected int doLoadBeanDefinitions(InputSource inputSource, Resource resource) throws BeanDefinitionStoreException { try { Document doc = doLoadDocument(inputSource, resource); int count = registerBeanDefinitions(doc, resource); return count; } }
第三步(BeanDefinitionParserDelegate类型下的decorateIfRequired方法)
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16public BeanDefinitionHolder decorateIfRequired( Node node, BeanDefinitionHolder originalDef, @Nullable BeanDefinition containingBd) { String namespaceUri = getNamespaceURI(node); if (namespaceUri != null && !isDefaultNamespace(namespaceUri)) { NamespaceHandler handler = this.readerContext.getNamespaceHandlerResolver().resolve(namespaceUri); if (handler != null) { BeanDefinitionHolder decorated = handler.decorate(node, originalDef, new ParserContext(this.readerContext, this, containingBd)); if (decorated != null) { return decorated; } } return originalDef; }
第四步 (DefaultListableBeanFactory类下的registerBeanDefinition)
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14@Override public void registerBeanDefinition(String beanName, BeanDefinition beanDefinition) throws BeanDefinitionStoreException { BeanDefinition existingDefinition = this.beanDefinitionMap.get(beanName); // Still in startup registration phase this.beanDefinitionMap.put(beanName, beanDefinition); this.beanDefinitionNames.add(beanName); removeManualSingletonName(beanName); }
知是行之始,行是知之成!
最后
以上就是闪闪楼房最近收集整理的关于Spring——简单介绍解析xml文件的全部内容,更多相关Spring——简单介绍解析xml文件内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复