这块主要是创建解析工具对象 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());}
