我正在尝试使用自定义注释查找所有 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
是空的。
我错过了什么?这两个方法都应该返回一些东西,但看起来注释在运行时已经从类中消失了??