我正在创建一个Spring Starter项目,需要获取标记有自定义注释的所有类。带注释的类不是spring bean。
我目前的解决方案是使用ClassPathScanningCandidateComponentProvider来查找所需的类。
ClassPathScanningCandidateComponentProvider scanner =
new ClassPathScanningCandidateComponentProvider(false);
scanner.addIncludeFilter(new AnnotationTypeFilter(CustomAnnotation.class));
candidates = scanner.findCandidateComponents("THE MISSING PACKAGE NAME");问题是我目前提供了一个空的包字符串,这样所有的包/类都会被扫描,这会减慢启动速度。
我需要访问由Spring扫描的包,以避免扫描所有包和类。
有没有办法以编程方式检索所有由Spring扫描的包,或者有没有另一种解决方案来检索非Spring bean的自定义注释类。
问候
发布于 2016-03-16 04:54:23
一种不需要进行完整类路径扫描的解决方案是使用AutowiredAnnotationBeanPostProcessor:
private List<Class<?>> candidates = new ArrayList<>();
@Override
public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
if(beanClass.isAnnotationPresent(YourAnnotation.class)){
candiates.add(beanClass));
System.out.println(beanClass);
return new Object();
}
}
@Bean
public CandiateHolder candidates() {
return new CandidateHolder(candidates);
}您可以检查应该实例化的bean类是否具有所需的注释。如果是这样的话,您可以将类添加到属性中,以便稍后将其公开为bean。您必须返回一个新对象的实例,而不是返回null。返回的对象可用于将类包装在代理中。因为我不需要实例,所以我将返回一个简单的新对象。这可能是一个肮脏的技巧,但它是有效的。
我必须使用这种技巧,因为所需对象的实例化将导致运行时错误,因为它必须在我使用的框架中实例化。
https://stackoverflow.com/questions/35975272
复制相似问题