docs: public Set<BeanDefinition> findCandidateComponents(String uriPrefix) {
          if (!uriPrefix.endsWith("/")) {
              uriPrefix = uriPrefix + "/";
          }
          Set<BeanDefinition> candidates = new LinkedHashSet<BeanDefinition>();
          try {
              String packageSearchPath = uriPrefix + this.resourcePattern;
              boolean traceEnabled = logger.isDebugEnabled();
              boolean debugEnabled = logger.isDebugEnabled();
              Resource[] resources = this.resourcePatternResolver.getResources(packageSearchPath);
              if (debugEnabled) {
                  logger.debug("[jade/find] find " + resources.length + " resources for "
                          + packageSearchPath);
              }
              for (int i = 0; i < resources.length; i++) {
                  Resource resource = resources[i];
                  if (traceEnabled) {
                      logger.trace("[jade/find] scanning " + resource);
                  }
                  // resourcePatternResolver.getResources出来的classPathResources，metadataReader对其进行getInputStream的时候为什么返回null呢？
                  // 不得不做一个exists判断
                  if (!resource.exists()) {
                      if (debugEnabled) {
                          logger.debug("Ignored because not exists:" + resource);
                      }
                  } else if (resource.isReadable()) {
                      MetadataReader metadataReader = metadataReaderFactory
                              .getMetadataReader(resource);
                      if (isCandidateComponent(metadataReader)) {
                          ScannedGenericBeanDefinition sbd = new ScannedGenericBeanDefinition(
                                  metadataReader);
                          sbd.setResource(resource);
                          sbd.setSource(resource);
                          if (sbd.getMetadata().isInterface() && sbd.getMetadata().isIndependent()) {
                              if (debugEnabled) {
                                  logger.debug("Identified candidate component class: " + resource);
                              }
                              candidates.add(sbd);
                          } else {
                              if (traceEnabled) {
                                  logger.trace("Ignored because not a interface top-level class: "
                                          + resource);
                              }
                          }
                      } else {
                          if (traceEnabled) {
                              logger.trace("Ignored because not matching any filter: " + resource);
                          }
                      }
                  } else {
                      if (traceEnabled) {
                          logger.trace("Ignored because not readable: " + resource);
                      }
                  }
              }
          } catch (IOException ex) {
              throw new BeanDefinitionStoreException("I/O failure during jade scanning", ex);
          }
          return candidates;
      }