1

我正在尝试使用自定义注释查找所有 bean,以便我可以查看每个 bean 上的注释属性以在计划作业中寻求帮助。

自定义 Spring 注解:

@Component
@Scope("prototype")
public @interface Importer {
    String value() default "";
    String fileRegex() default "";
}

示例类定义(MyAwesomeImporterFramework 是一个基类——没有注释)

@Importer(value="spring.bean.name", fileRegex="myfile.*\\.csv")
public class MyAwesomeImporter extends MyAwesomeImporterFramework

查找带有注释的 Spring bean 的代码:

public static List<Class<?>> findBeanClasses(String packageName, Class<? extends Annotation> annotation) throws ClassNotFoundException {
    List<Class<?>> classes = new LinkedList<Class<?>>();

    ClassPathScanningCandidateComponentProvider scanner =
            new ClassPathScanningCandidateComponentProvider(false);
    scanner.addIncludeFilter(new AnnotationTypeFilter(annotation));

    for(BeanDefinition def : scanner.findCandidateComponents(packageName)) {
        classes.add(Class.forName(def.getBeanClassName()));
    }

    return classes;
}

利用查找器获取注释属性的代码。

for(Class<?> clazz : AnnotationFinder.findBeanClasses(CLASS_BASE_PACKAGE, Importer.class)) {
    // Doesn't work either:
    // Importer annotation = clazz.getAnnotation(Importer.class);
    Importer annotation = AnnotationUtils.findAnnotation(clazz, Importer.class);
    importClasses.put(annotation.fileRegex(), annotation.value());
}

在这里,两者都clazz.getAnnotation(Importer.class)返回AnnotationUtils.findAnnotation(clazz, Importer.class)null。在调试器中检查代码显示了正确的类被识别,但注解映射clazz是空的。

我错过了什么?这两个方法都应该返回一些东西,但看起来注释在运行时已经从类中消失了??

4

0 回答 0