我正在创建一个Spring Starter项目,需要获取所有标有自定义注释的类。带注释的类不是spring bean。
我目前的解决方案是使用ClassPathScanningCandidateComponentProvider来查找所需的类。
ClassPathScanningCandidateComponentProvider scanner =
new ClassPathScanningCandidateComponentProvider(false);
scanner.addIncludeFilter(new AnnotationTypeFilter(CustomAnnotation.class));
candidates = scanner.findCandidateComponents("THE MISSING PACKAGE NAME");
问题是我目前提供一个空包String,以便扫描所有包/类,这会减慢启动速度。
我需要访问Spring扫描的软件包,以避免扫描所有软件包和类。
有没有办法以编程方式检索由Spring扫描的所有包,或者是否有另一种解决方案来检索不是Spring bean的自定义注释类。
迎接
答案 0 :(得分:0)
无需进行完整类路径扫描的一种解决方案是使用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,而是返回新Object的实例。返回的对象可用于将类包装在代理中。因为我不需要实例我将返回一个简单的新对象。它可能是一个肮脏的黑客,但它的工作原理。
我必须使用这种hack导致所需对象的实例化将导致运行时错误,因为它必须在我使用的框架中实例化。