spring源码阅读 Bean加载之自定义标签加载

Posted aquariusm

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spring源码阅读 Bean加载之自定义标签加载相关的知识,希望对你有一定的参考价值。

紧接着上一篇关于spring默认标签加载,这一篇来看下自定义标签的加载

继续从 DefaultBeanDefinitionDocumentReader来看

protected void parseBeanDefinitions(Element root, BeanDefinitionParserDelegate delegate) 
        if (delegate.isDefaultNamespace(root)) 
            NodeList nl = root.getChildNodes();

            for(int i = 0; i < nl.getLength(); ++i) 
                Node node = nl.item(i);
                if (node instanceof Element) 
                    Element ele = (Element)node;
                    if (delegate.isDefaultNamespace(ele)) 
                        this.parseDefaultElement(ele, delegate); // 默认标签解析
                     else 
                        delegate.parseCustomElement(ele); // 自定义标签解析
                    
                
            
         else 
            delegate.parseCustomElement(root);  // 自定义标签解析
        

    

写在前边的东西,最近结合着《架构整洁之道》和《spring源码深度解析》这两本书一块儿看着,架构整洁之道里描述的一些面向对象的开发原则,接口隔离/单一职责/开闭幕式/依赖反转/里式替换

这些原则,在spring的源码里可谓是用的淋漓尽致,尤其单一职责/接口隔离,这两个翻看源码的时候尤其有体会,之前自己在项目开发中,其实根本没有在一这些事情,只是按照业务划分进行接口的拆分,并不在意是否是单一职责/是否接口隔离这些事情,其实单一职责能让我们更好的去拓展和维护我们的代码。包括接口隔离其实都是这样的目的。能够符合这些规则,我们的代码就能更大限度的符合高可维护性/低耦合性这些要求,也就能实现最大限度的优化开发效率这件事情。

好了,扯了些题外话,我们继续自定义标签的解析工作:

public BeanDefinition parseCustomElement(Element ele) 
        return this.parseCustomElement(ele, (BeanDefinition)null);
    
public BeanDefinition parseCustomElement(Element ele, BeanDefinition containingBd) 
        String namespaceUri = this.getNamespaceURI(ele);
        NamespaceHandler handler = this.readerContext.getNamespaceHandlerResolver().resolve(namespaceUri);
        if (handler == null) 
            this.error("Unable to locate Spring NamespaceHandler for XML schema namespace [" + namespaceUri + "]", ele);
            return null;
         else 
            return handler.parse(ele, new ParserContext(this.readerContext, this, containingBd));
        
    

 看到这里有点儿蒙圈,如果没有用过自定义标签的话,会有些蒙,那我们不妨在第一篇的例子上我们搞一个自定义标签来试试。

 

以上是关于spring源码阅读 Bean加载之自定义标签加载的主要内容,如果未能解决你的问题,请参考以下文章

Spring源码分析

spring源码深度解析— IOC 之 开启 bean 的加载

spring源码阅读-- 容器启动之加载BeanDefinition

Spring源码--03--加载bean的定义信息---Spring注解解析原理

推荐一本Spring源码解析的书籍!

spring源码阅读-- 容器启动之BeanFactoryPostProcessor