熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java開源技術 >> 正文

Spring Security 2資源-角色查找源碼研究及性能改進

2022-06-13   來源: Java開源技術 

  在研究SS的時候把Source存放到數據庫中進行角色配置SS把這些資源角色讀取到一個Map中在得到一個URL請求時使用這個URL遍歷這個Map查找是否存在這個Key如果有則取出對應的角色

  問題就在這個遍歷Map上源代碼如下




    private ConfigAttributeDefinition lookupUrlInMap(Map requestMap String url) {
        Iterator entries = requestMapentrySet(erator();

        while (entrieshasNext()) {
            MapEntry entry = (MapEntry) entriesnext();
            Object p = entrygetKey();
            boolean matched = urlMatcherpathMatchesUrl(p url);

            if (loggerisDebugEnabled()) {
                loggerdebug(Candidate is:  + url + ; pattern is  + p + ; matched= + matched);
            }

            if (matched) {
                return (ConfigAttributeDefinition) entrygetValue();
            }
        }

        return null;
    }

  return null}這個Method中一上來就作遍歷循環為什麼不先利用Map的特性直接先取一次如果取得到直接就返回了如果取不到再遍歷查找這樣可以提高命中率從而提高性能如果找不到這一次的Map查找性能應該也不是很低吧?




    private ConfigAttributeDefinition lookupUrlInMap(Map requestMap String url) {
        ConfigAttributeDefinition cad = (ConfigAttributeDefinition)requestMapget(url);
        if(cad != null) {
            return cad;
        }
          
        Iterator entries = requestMapentrySet(erator();

        while (entrieshasNext()) {
            MapEntry entry = (MapEntry) entriesnext();
            Object p = entrygetKey();
            boolean matched = urlMatcherpathMatchesUrl(p url);

            if (loggerisDebugEnabled()) {
                loggerdebug(Candidate is:  + url + ; pattern is  + p + ; matched= + matched);
            }

            if (matched) {
                return (ConfigAttributeDefinition) entrygetValue();
            }
        }

        return null;
    }

  當然這要權衡系統URL配置的特性諸如xxx*這種類型的配置多的話還是原來的方式快一點如果直接xxx這種方式多得話我說的方式就要快一些

  總之沒有最好只有更好!


From:http://tw.wingwit.com/Article/program/Java/ky/201311/28285.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.