Spring自動加載指定路徑規則的文件--PathMatchingResourcePatternResolver


使用場景:

  根據配置路徑自動加載符合路徑規則的xml文件、類文件等等;

  查找范圍:當前工程,當前工程依賴的jar包;

示例:

public void testGetResources(){
    ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver();
    try {
      Resource[] metaInfResources = resourcePatternResolver
          .getResources("classpath*:**/*DAO.class");
      for(Resource r : metaInfResources){
        System.out.println("URL:" + r.getURL());
      }
    } catch (IOException e) {
      e.printStackTrace();
    }
  }

輸出結果:

URL:file:/D:/workspace/upd/sogou-passport/sogou-passport/passport-main-service/target/classes/com/sogou/upd/passport/dao/account/AccountAuthDAO.class
URL:file:/D:/workspace/upd/sogou-passport/sogou-passport/passport-main-service/target/classes/com/sogou/upd/passport/dao/account/AccountConnectDAO.class
URL:file:/D:/workspace/upd/sogou-passport/sogou-passport/passport-main-service/target/classes/com/sogou/upd/passport/dao/account/AccountDAO.class
URL:file:/D:/workspace/upd/sogou-passport/sogou-passport/passport-main-service/target/classes/com/sogou/upd/passport/dao/app/AppConfigDAO.class

研究源碼:

1.getResources(locationPattern)方法

  首先判斷是否以classpath*:前綴,如果是則判斷locationPattern是否包含有通配符(*或?)、如果包含通配符則調用findPathMatchingResources方法、沒有包含通配符就不需要解析了調用findAllClassPathResources方法。

2.findPathMatchingResources方法

protected Resource[] findPathMatchingResources(String locationPattern) throws IOException {
        String rootDirPath = determineRootDir(locationPattern);
        String subPattern = locationPattern.substring(rootDirPath.length());
        Resource[] rootDirResources = getResources(rootDirPath);
        Set<Resource> result = new LinkedHashSet<Resource>(16);
        for (Resource rootDirResource : rootDirResources) {
            rootDirResource = resolveRootDirResource(rootDirResource);
            if (isJarResource(rootDirResource)) {
                result.addAll(doFindPathMatchingJarResources(rootDirResource, subPattern));
            }
            else if (rootDirResource.getURL().getProtocol().startsWith(ResourceUtils.URL_PROTOCOL_VFS)) {
                result.addAll(VfsResourceMatchingDelegate.findMatchingResources(rootDirResource, subPattern, getPathMatcher()));
            }
            else {
                result.addAll(doFindPathMatchingFileResources(rootDirResource, subPattern));
            }
        }
        if (logger.isDebugEnabled()) {
            logger.debug("Resolved location pattern [" + locationPattern + "] to resources " + result);
        }
        return result.toArray(new Resource[result.size()]);
    }

     把locationPattern拆分成兩部分:rootDirPath 和subPattern,rootDirPath是根目錄路徑,subPattern是子目錄路徑匹配規則字符串。歷遍根目錄下的所有子目錄、並得到所有的子目錄在doFindPathMatchingFileResources(rootDirResource, subPattern)方法中,再根據子目錄逐個逐個去匹配subPattern。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM