通過上面兩篇博客,我們能夠得到指定類上的全部請求路徑。現在需要的是,給定一個指定的路徑,獲取全部的請求路徑。
public class RequestUrlScannerHelper { /** * 以下三個參數通過IOC注入進來 */ private String basePackage; //掃描的基礎包 private ResourcePatternResolver resolver; //解析器 private TypeFilter controlFilter = new AnnotationTypeFilter(Controller.class, false); private String pattern; private Set<Class<?>> matchControlerClass = new HashSet<Class<?>>(); /** * 根據basePackage得到全部的class文件,並進行匹配,將滿足條件的class存儲與set集合中。 * @throws IOException * @throws ClassNotFoundException */ @PostConstruct public void init() throws IOException, ClassNotFoundException { pattern = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX + ClassUtils.convertClassNameToResourcePath(basePackage) + "/**/*.class"; Resource[] resources = resolver.getResources(pattern); MetadataReaderFactory factory = new CachingMetadataReaderFactory(resolver); for(Resource resource : resources) { if(resource.isReadable()) { MetadataReader reader = factory.getMetadataReader(resource); if(controlFilter.match(reader, factory)) { matchControlerClass.add(Class.forName(reader.getClassMetadata().getClassName())); } } } } public String getBasePackage() { return basePackage; } public void setBasePackage(String basePackage) { this.basePackage = basePackage; } public ResourcePatternResolver getResolver() { return resolver; } public void setResolver(ResourcePatternResolver resolver) { this.resolver = resolver; } /** * * @return 指定包下的全部請求信息。 * @throws NoSuchMethodException * @throws SecurityException * @throws IllegalAccessException * @throws IllegalArgumentException * @throws InvocationTargetException */ public List<RequestUrlInfo> getAllRequestUrl() throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { List<RequestUrlInfo> infos = new ArrayList<RequestUrlInfo>(); for(Class<?> scannerClass : matchControlerClass) { infos.addAll(RequestUrlHelper.getInstance().getAllRequestUrlInfos(scannerClass)); } return infos; } }