我正在尝试使用自定义注释查找所有bean,因此我可以查看每个bean上的注释属性,以获得有关预定作业的帮助。
自定义弹簧注释:
@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;
}
利用finder获取注释属性的代码。
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
上的注释映射为空。
我错过了什么?这两个方法都应该返回一些东西,但是几乎看起来注释在运行时期间已经从类中消失了吗?