使用場景:
根據配置路徑自動加載符合路徑規則的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。