主要代码结构如下:
//Ant模式通配符的Resource查找器 ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver(); //缓存MetadataReader工厂类 MetadataReaderFactory metadataReaderFactory = new CachingMetadataReaderFactory(resourcePatternResolver); private final List<TypeFilter> includeFilters = new LinkedList<TypeFilter>(); private final List<TypeFilter> excludeFilters = new LinkedList<TypeFilter>(); public void loadClass(){ try{ //增加过滤条件,提取出有Component注解类的资源 this.includeFilters.add(new AnnotationTypeFilter(Component.class, true, true)); String pattern = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX + "com/cjm" + "/**/*.class"; //查找到一批资源 Resource[] resources = resourcePatternResolver.getResources(pattern); for(Resource resource : resources){ if(resource.isReadable()){ //获取资源的元数据读取器 MetadataReader metadataReader = metadataReaderFactory.getMetadataReader(resource); //对资源进行过滤处理 if(isCandidateComponent(metadataReader)){ //从元数据中取得类名 String className = metadataReader.getAnnotationMetadata().getClassName(); //根据类名记载类 Class<?> clazz = ClassUtils.forName(className, Test.class.getClassLoader()); System.out.println(clazz.getName()); } } } }catch(Exception ex){ ex.printStackTrace(); } } private boolean isCandidateComponent(MetadataReader metadataReader) throws IOException { for (TypeFilter tf : this.excludeFilters) { if (tf.match(metadataReader, this.metadataReaderFactory)) { return false; } } for (TypeFilter tf : this.includeFilters) { if (tf.match(metadataReader, this.metadataReaderFactory)) { return true; } } return false; }