这块主要是创建解析工具对象 BeanDefinitionDocumentReader。
得到了 xml 配置文件对象 Document,接下来就是解析里面的内容。
/**
* 注册解析XML的Bean
*/
public int registerBeanDefinitions(Document doc, Resource resource) throws BeanDefinitionStoreException {
// 创建解析工具对象
BeanDefinitionDocumentReader documentReader = createBeanDefinitionDocumentReader();
// 已经注册Bean的数量
int countBefore = getRegistry().getBeanDefinitionCount();
// 注册bean;createReaderContext(resource) 组装下注册需要的一些其他小组件
documentReader.registerBeanDefinitions(doc, createReaderContext(resource));
return getRegistry().getBeanDefinitionCount() - countBefore;
}
public XmlReaderContext createReaderContext(Resource resource) {
return new XmlReaderContext(resource, this.problemReporter, this.eventListener,
this.sourceExtractor, this, getNamespaceHandlerResolver());
}
- 首先创建解析工具 BeanDefinitionDocumentReader ;
- 获取计数;
- 创建 XmlReaderContext 对象,这个对象在后面的解析自定义标签能用上,通过它中的组件 NamespaceHandlerResolver 可以获取到自定义标签解析器(比如:aop 相关标签🏷)。
通过 createReaderContext 方法中,这里新建了 XmlReaderContext 对象,
并且设置了 NamespaceHandlerResolver 为 DefaultNamespaceHandlerResolver 。
源码如下:
org.springframework.beans.factory.xml.XmlBeanDefinitionReader
public XmlReaderContext createReaderContext(Resource resource) {
return new XmlReaderContext(resource, this.problemReporter, this.eventListener,
this.sourceExtractor, this, getNamespaceHandlerResolver());
}
public NamespaceHandlerResolver getNamespaceHandlerResolver() {
if (this.namespaceHandlerResolver == null) {
this.namespaceHandlerResolver = createDefaultNamespaceHandlerResolver();
}
return this.namespaceHandlerResolver;
}
protected NamespaceHandlerResolver createDefaultNamespaceHandlerResolver() {
ClassLoader cl = (getResourceLoader() != null ? getResourceLoader().getClassLoader() : getBeanClassLoader());
return new DefaultNamespaceHandlerResolver(cl);
}
创建默认的 DefaultNamespaceHandlerResolver ,这里面指定了自定义标签处理器配置文件的位置,默认在 DEFAULT_HANDLER_MAPPINGS_LOCATION = “META-INF/spring.handlers” ,那么需要的时候会在包的这个位置加载处理器。
org.springframework.beans.factory.xml.DefaultNamespaceHandlerResolver#DefaultNamespaceHandlerResolver
public DefaultNamespaceHandlerResolver(@Nullable ClassLoader classLoader) {
this(classLoader, DEFAULT_HANDLER_MAPPINGS_LOCATION);
}
- 开始解析;
public void registerBeanDefinitions(Document doc, XmlReaderContext readerContext) {
this.readerContext = readerContext;
doRegisterBeanDefinitions(doc.getDocumentElement());
}