日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

【死磕 Spring】----- IOC 之解析 bean 标签:解析自定义标签

發(fā)布時(shí)間:2023/12/6 javascript 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【死磕 Spring】----- IOC 之解析 bean 标签:解析自定义标签 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
前面四篇文章都是分析 Bean 默認(rèn)標(biāo)簽的解析過程,包括基本屬性、六個(gè)子元素(meta、lookup-method、replaced-method、constructor-arg、property、qualifier),涉及內(nèi)容較多,拆分成了四篇文章,導(dǎo)致我們已經(jīng)忘記從哪里出發(fā)的了,勿忘初心

processBeanDefinition() 負(fù)責(zé) Bean 標(biāo)簽的解析,在解析過程中首先調(diào)用BeanDefinitionParserDelegate.parseBeanDefinitionElement() 完成默認(rèn)標(biāo)簽的解析,如果解析成功(返回的 bdHolder != null ),則首先調(diào)用 BeanDefinitionParserDelegate.decorateBeanDefinitionIfRequired() 完成自定義標(biāo)簽元素解析,前面四篇文章已經(jīng)分析了默認(rèn)標(biāo)簽的解析,所以這篇文章分析自定義標(biāo)簽的解析。

  • public BeanDefinitionHolder decorateBeanDefinitionIfRequired(Element ele, BeanDefinitionHolder definitionHolder) {

  • return decorateBeanDefinitionIfRequired(ele, definitionHolder, null);

  • }

  • 調(diào)用 decorateBeanDefinitionIfRequired() :

  • public BeanDefinitionHolder decorateBeanDefinitionIfRequired(

  • Element ele, BeanDefinitionHolder definitionHolder, @Nullable BeanDefinition containingBd) {


  • BeanDefinitionHolder finalDefinition = definitionHolder;


  • // 遍歷節(jié)點(diǎn),查看是否有適用于裝飾的屬性

  • NamedNodeMap attributes = ele.getAttributes();

  • for (int i = 0; i < attributes.getLength(); i++) {

  • Node node = attributes.item(i);

  • finalDefinition = decorateIfRequired(node, finalDefinition, containingBd);

  • }


  • // 遍歷子節(jié)點(diǎn),查看是否有適用于修飾的子元素

  • NodeList children = ele.getChildNodes();

  • for (int i = 0; i < children.getLength(); i++) {

  • Node node = children.item(i);

  • if (node.getNodeType() == Node.ELEMENT_NODE) {

  • finalDefinition = decorateIfRequired(node, finalDefinition, containingBd);

  • }

  • }

  • return finalDefinition;

  • }

  • 遍歷節(jié)點(diǎn)(子節(jié)點(diǎn)),調(diào)用 decorateIfRequired() 裝飾節(jié)點(diǎn)(子節(jié)點(diǎn))。

  • public BeanDefinitionHolder decorateIfRequired(

  • Node node, BeanDefinitionHolder originalDef, @Nullable BeanDefinition containingBd) {

  • // 獲取自定義標(biāo)簽的命名空間

  • String namespaceUri = getNamespaceURI(node);

  • // 過濾掉默認(rèn)命名標(biāo)簽

  • if (namespaceUri != null && !isDefaultNamespace(namespaceUri)) {

  • // 獲取相應(yīng)的處理器

  • NamespaceHandler handler = this.readerContext.getNamespaceHandlerResolver().resolve(namespaceUri);

  • if (handler != null) {

  • // 進(jìn)行裝飾處理

  • BeanDefinitionHolder decorated =

  • handler.decorate(node, originalDef, new ParserContext(this.readerContext, this, containingBd));

  • if (decorated != null) {

  • return decorated;

  • }

  • }

  • else if (namespaceUri.startsWith("http://www.springframework.org/")) {

  • error("Unable to locate Spring NamespaceHandler for XML schema namespace [" + namespaceUri + "]", node);

  • }

  • else {

  • if (logger.isDebugEnabled()) {

  • logger.debug("No Spring NamespaceHandler found for XML schema namespace [" + namespaceUri + "]");

  • }

  • }

  • }

  • return originalDef;

  • }

  • 首先獲取自定義標(biāo)簽的命名空間,如果不是默認(rèn)的命名空間則根據(jù)該命名空間獲取相應(yīng)的處理器,最后調(diào)用處理器的 decorate() 進(jìn)行裝飾處理。具體的裝飾過程這里不進(jìn)行講述,在后面分析自定義標(biāo)簽時(shí)會(huì)做詳細(xì)說明。

    至此,Bean 的解析過程已經(jīng)全部完成了,下面做一個(gè)簡(jiǎn)要的總結(jié)。

    解析 BeanDefinition 的入口在 DefaultBeanDefinitionDocumentReader.parseBeanDefinitions() 。該方法會(huì)根據(jù)命令空間來判斷標(biāo)簽是默認(rèn)標(biāo)簽還是自定義標(biāo)簽,其中默認(rèn)標(biāo)簽由 parseDefaultElement() 實(shí)現(xiàn),自定義標(biāo)簽由 parseCustomElement() 實(shí)現(xiàn)。在默認(rèn)標(biāo)簽解析中,會(huì)根據(jù)標(biāo)簽名稱的不同進(jìn)行 import 、alias 、bean 、beans 四大標(biāo)簽進(jìn)行處理,其中 bean 標(biāo)簽的解析為核心,它由 processBeanDefinition() 方法實(shí)現(xiàn)。 processBeanDefinition() 開始進(jìn)入解析核心工作,分為三步:

  • 解析默認(rèn)標(biāo)簽: BeanDefinitionParserDelegate.parseBeanDefinitionElement()

  • 解析默認(rèn)標(biāo)簽下的自定義標(biāo)簽: BeanDefinitionParserDelegate.decorateBeanDefinitionIfRequired()

  • 注冊(cè)解析的 BeanDefinition: BeanDefinitionReaderUtils.registerBeanDefinition

  • 在默認(rèn)標(biāo)簽解析過程中,核心工作由 parseBeanDefinitionElement() 方法實(shí)現(xiàn),該方法會(huì)依次解析 Bean 標(biāo)簽的屬性、各個(gè)子元素,解析完成后返回一個(gè) GenericBeanDefinition 實(shí)例對(duì)象。


    原文發(fā)布時(shí)間為:2018-09-26
    本文作者:Java技術(shù)驛站
    本文來自云棲社區(qū)合作伙伴“Java技術(shù)驛站”,了解相關(guān)信息可以關(guān)注“Java技術(shù)驛站”。

    總結(jié)

    以上是生活随笔為你收集整理的【死磕 Spring】----- IOC 之解析 bean 标签:解析自定义标签的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。