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源码深度解析— IOC 之 开启 bean 的加载
spring源码阅读-- 容器启动之加载BeanDefinition