这块主要是创建解析工具对象 BeanDefinitionDocumentReader。

    得到了 xml 配置文件对象 Document,接下来就是解析里面的内容。

    1. /**
    2. * 注册解析XML的Bean
    3. */
    4. public int registerBeanDefinitions(Document doc, Resource resource) throws BeanDefinitionStoreException {
    5. // 创建解析工具对象
    6. BeanDefinitionDocumentReader documentReader = createBeanDefinitionDocumentReader();
    7. // 已经注册Bean的数量
    8. int countBefore = getRegistry().getBeanDefinitionCount();
    9. // 注册bean;createReaderContext(resource) 组装下注册需要的一些其他小组件
    10. documentReader.registerBeanDefinitions(doc, createReaderContext(resource));
    11. return getRegistry().getBeanDefinitionCount() - countBefore;
    12. }
    13. public XmlReaderContext createReaderContext(Resource resource) {
    14. return new XmlReaderContext(resource, this.problemReporter, this.eventListener,
    15. this.sourceExtractor, this, getNamespaceHandlerResolver());
    16. }
    1. 首先创建解析工具 BeanDefinitionDocumentReader ;
    2. 获取计数;
    3. 创建 XmlReaderContext 对象,这个对象在后面的解析自定义标签能用上,通过它中的组件 NamespaceHandlerResolver 可以获取到自定义标签解析器(比如:aop 相关标签🏷)。

    通过 createReaderContext 方法中,这里新建了 XmlReaderContext 对象,
    并且设置了 NamespaceHandlerResolver 为 DefaultNamespaceHandlerResolver 。
    源码如下:
    org.springframework.beans.factory.xml.XmlBeanDefinitionReader

    1. public XmlReaderContext createReaderContext(Resource resource) {
    2. return new XmlReaderContext(resource, this.problemReporter, this.eventListener,
    3. this.sourceExtractor, this, getNamespaceHandlerResolver());
    4. }
    5. public NamespaceHandlerResolver getNamespaceHandlerResolver() {
    6. if (this.namespaceHandlerResolver == null) {
    7. this.namespaceHandlerResolver = createDefaultNamespaceHandlerResolver();
    8. }
    9. return this.namespaceHandlerResolver;
    10. }
    11. protected NamespaceHandlerResolver createDefaultNamespaceHandlerResolver() {
    12. ClassLoader cl = (getResourceLoader() != null ? getResourceLoader().getClassLoader() : getBeanClassLoader());
    13. return new DefaultNamespaceHandlerResolver(cl);
    14. }

    创建默认的 DefaultNamespaceHandlerResolver ,这里面指定了自定义标签处理器配置文件的位置,默认在 DEFAULT_HANDLER_MAPPINGS_LOCATION = “META-INF/spring.handlers” ,那么需要的时候会在包的这个位置加载处理器。
    org.springframework.beans.factory.xml.DefaultNamespaceHandlerResolver#DefaultNamespaceHandlerResolver

    1. public DefaultNamespaceHandlerResolver(@Nullable ClassLoader classLoader) {
    2. this(classLoader, DEFAULT_HANDLER_MAPPINGS_LOCATION);
    3. }
    1. 开始解析;
      1. public void registerBeanDefinitions(Document doc, XmlReaderContext readerContext) {
      2. this.readerContext = readerContext;
      3. doRegisterBeanDefinitions(doc.getDocumentElement());
      4. }