Spring源碼之SimpleAliasRegistry解讀(一)java
閱讀spring源碼中org.springframework.core.SimpleAliasRegistry類時發現該類主要是使用map做爲alias的緩存,並對接口AliasRegistry進行實現。spring
在閱讀該源碼中對hasAlias(String name, String alias);方法產生了疑惑。源碼註釋中解釋該方法的做用是:肯定給定的名稱是否已註冊了給定的別名。緩存
該方法源碼以下:ui
public boolean hasAlias(String name, String alias) { //遍歷Map for (Map.Entry<String, String> entry : this.aliasMap.entrySet()) { //獲取值 String registeredName = entry.getValue(); //判斷該值與傳入的name是否相等 if (registeredName.equals(name)) { //若是相等,則獲取該值對應得鍵 String registeredAlias = entry.getKey(); //判斷該鍵與傳入的別名是否相等,若是相等則返回true //若是不想等,則將該鍵與傳入的別名做爲此方法的參數,進行遞歸調用 return (registeredAlias.equals(alias) || hasAlias(registeredAlias, alias)); } } return false; }
以及使用到的成員變量是:this
private final Map<String, String> aliasMap = new ConcurrentHashMap<String, String>(16);
爲了分析我爲每行添加了註釋,剛開始使我不能理解的是return (registeredAlias.equals(alias) || hasAlias(registeredAlias, alias));
這行代碼。爲何遞歸調用hasAlias方法時傳入的第一個參數不是name。spa
通過分析,發現設計該map時,不是爲了存放單一的鍵值對。.net
我想到了兩種假設:設計
假設一:map是存放一個相似於倒着的樹。name是做爲根節點而存在的,alias是做爲根節點下的子節點。可是又出現一個問題,按hasAlias這個方法來循環遍歷是永遠也遍歷不到全部父節點下的第二個子節點,因此這個假設被否認。code
假設二:一條節點鏈。name是該鏈的頭,alias是該鏈除了頭以外的其餘節點,只要傳入該方法的alias是該鏈的除頭部以外的某一節點,返回的就是true,和方法給定的解釋正好吻合。blog
若是解釋的不對,請讀者朋友留言告知,謝謝!