【问题标题】:How Do I Scan for Annotation in Spring Web App Using Reflections Library (or other)如何使用反射库(或其他)扫描 Spring Web App 中的注释
【发布时间】:2014-06-04 21:01:28
【问题描述】:

我有一个使用 Spring 构建并在 Jboss 中运行的 Web 应用程序。我正在尝试在运行时扫描具有特定注释的类。现在我正在使用开源Reflections library

public static List<Class> scanForClassesWithAnnotation(Class<? extends Annotation> annotationClass)
{
    List<Class> classesWithAnnotation = new ArrayList<>();
    for(Package p : Package.getPackages())
    {
        LOGGER.info("scanForClassesWithAnnotation: Examining package " + p.getName());

        try
        {
            List<ClassLoader> classLoadersList = new ArrayList<>();
            classLoadersList.add(ClasspathHelper.contextClassLoader());
            classLoadersList.add(ClasspathHelper.staticClassLoader());

            Reflections reflections = new Reflections(
                new ConfigurationBuilder()
                    .setScanners(new SubTypesScanner(false), new ResourcesScanner())
                    .setUrls(ClasspathHelper.forClassLoader(classLoadersList.toArray(new ClassLoader[classLoadersList.size()])))
                    .filterInputsBy(new FilterBuilder().include(FilterBuilder.prefix(p.getName()))));

            Set<Class<?>> classes = reflections.getSubTypesOf(Object.class);

            LOGGER.info("\tscanForClassesWithAnnotation: found classes " + JsonUtils.objectToJson(classes));

            for(Class foundClass : classes)
            {
                if(foundClass.isAnnotationPresent(annotationClass))
                {
                    classesWithAnnotation.add(foundClass);
                }
            }
        } catch (Exception ignored) {}
    }
    return classesWithAnnotation;
}

当这段代码执行时,我在日志中看到许多这样的消息:

given scan urls are empty. set urls in the configuration

这段代码在一个独立的 Maven 项目中工作,所以我知道它通常可以工作。但我认为问题在于代码在 servlet 上下文中运行。我该如何解决?如何在 Spring webapp 中扫描带有注释的类?提前致谢。

【问题讨论】:

    标签: java spring spring-mvc annotations reflections


    【解决方案1】:

    开始玩

    public class Scanner {
    
        private static final Log log = LogFactory.getLog(Scanner.class);
    
        public static void main(String[] args) throws IOException {
            SimpleMetadataReaderFactory metadataFactory = new SimpleMetadataReaderFactory();
            ResourcePatternResolver scaner = new PathMatchingResourcePatternResolver();
            Resource[] resources = scaner.getResources("classpath*:/base.package/**/*.class");
            for (Resource r : resources) {
                log.info("Scanning [" + r.getDescription() + "]");
                MetadataReader metadataReader = metadataFactory.getMetadataReader(r);
                if (metadataReader.getAnnotationMetadata().isAnnotated("org.example.Annotation"))
                    log.info("found annotation in [" + r.getDescription() + "]");
    
            }
        }
    

    【讨论】:

      【解决方案2】:

      这行得通

          public static List<Class> scanForClassesWithAnnotation2(Class<? extends Annotation> annotationClass)
      {
          List<Class> classesWithAnnotation = new ArrayList<>();
      
          ClassPathScanningCandidateComponentProvider scanner =
              new ClassPathScanningCandidateComponentProvider(false);
      
          scanner.addIncludeFilter(new AnnotationTypeFilter(annotationClass));
      
          for (BeanDefinition bd : scanner.findCandidateComponents("com.example"))
          {
              try
              {
                  classesWithAnnotation.add(Class.forName(bd.getBeanClassName()));
              } catch (ClassNotFoundException e)
              {
                  LOGGER.error("Could not create class from class name");
              }
          }
      
          return classesWithAnnotation;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-05
        • 2012-10-29
        • 2012-10-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多