Spring 原始碼解析 自定義標籤

2021-07-24 15:30:48 字數 2372 閱讀 3900

零. 閱讀準備

讀這篇文章前先看下預備知識:spring 自定義標籤

一. **閱讀

自定義標籤解析核心**:

public beandefinition parsecustomelement(element ele, beandefinition containingbd) 

return handler.parse(ele, new parsercontext(this.readercontext, this, containingbd));

}

可以看出 spring **邏輯很清晰:

(1) getnamespaceuri() 獲取自定義標籤的 namespace

public string getnamespaceuri(node node)
就是常規的 xml 內容提取

(2)而後使用 namespace 獲取相應處理的 handler

debug 到這一步發現是使用了 namespacehandlerresolver 的實現類 defaultnamespacehandlerresolver 來獲取對應的 handler

@override

public namespacehandler resolve(string namespaceuri)

else if (handlerorclassname instanceof namespacehandler)

else

// 用反射來例項化類

namespacehandler namespacehandler = (namespacehandler) beanutils.instantiateclass(handlerclass);

// 類有了,就呼叫我們為自定義標籤重寫過的 init 方法

namespacehandler.init();

// 放入快取

return namespacehandler;

}catch (classnotfoundexception ex)

catch (linkageerror err) }}

放入快取後,我們可以看到快取中已經有了我們為自定義標籤新增的 handler:

(3)最後由 handler 指定的 parser 來解析自定義的標籤

@override

public beandefinition parse(element element, parsercontext parsercontext)

private beandefinitionparser findparserforelement(element element, parsercontext parsercontext) 

return parser;

}

@override

public final beandefinition parse(element element, parsercontext parsercontext)

string aliases = null;

if (shouldparsenameasaliases())

}// 將 abstractbeandefinition 轉換為 beandefinitionholder

beandefinitionholder holder = new beandefinitionholder(definition, id, aliases);

// 註冊 holder

registerbeandefinition(holder, parsercontext.getregistry());

if (shouldfireevents())

}catch (beandefinitionstoreexception ex)

}return definition;

}

到此,自定義標籤的資料就從配置檔案載入到了記憶體,自定義標籤的解析其實就是 spring 提供給開發者的擴充套件使用,整體解析過程和 spring 預設的標籤類似。

spring原始碼解析 3 自定義標籤的解析

自定義標籤的解析在方法parsecustomelement 中完成.擴充套件spring自定義標籤的步驟 建立乙個需要擴充套件的元件 定義乙個xsd檔案描述元件內容 建立乙個檔案,實現beandefinitionparse介面,用來解析xsd檔案中的定義和元件定義 建立乙個handler檔案,擴充套...

Spring自定義標籤範例,以及原始碼解析

一 自定義標籤範例 1.實現自己的註解xsd xsd complextype xsd complexcontent 2.定義meta inf spring.schemas 配置檔案 3.定義meta inf spring.handlers 配置處理類 4.實現處理類,這裡並沒有真正處理,而是委託給t...

spring原始碼解讀(三) 編寫自定義標籤

在spring中,我們經常使用spring中給我提供的便簽來完成很多功能,有的時候當spring提供的標籤無法滿足我們的開發時,這是,我們就可以使用自定義標籤來擴充套件我們的程式,下面我們就來看看如何使用自定義標籤功能。1.首先定義乙個實體,用來接收自定義的配置標籤 public class use...