零. 閱讀準備
讀這篇文章前先看下預備知識: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...