Spring - 检索所有扫描的包

时间:2016-03-13 20:15:21

标签: spring spring-boot

我正在创建一个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的自定义注释类。

迎接

1 个答案:

答案 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导致所需对象的实例化将导致运行时错误,因为它必须在我使用的框架中实例化。