首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring -检索所有扫描的包

Spring -检索所有扫描的包
EN

Stack Overflow用户
提问于 2016-03-14 04:15:21
回答 1查看 526关注 0票数 0

我正在创建一个Spring Starter项目,需要获取标记有自定义注释的所有类。带注释的类不是spring bean。

我目前的解决方案是使用ClassPathScanningCandidateComponentProvider来查找所需的类。

代码语言:javascript
复制
ClassPathScanningCandidateComponentProvider scanner =
            new ClassPathScanningCandidateComponentProvider(false);
    scanner.addIncludeFilter(new AnnotationTypeFilter(CustomAnnotation.class));
    candidates = scanner.findCandidateComponents("THE MISSING PACKAGE NAME");

问题是我目前提供了一个空的包字符串,这样所有的包/类都会被扫描,这会减慢启动速度。

我需要访问由Spring扫描的包,以避免扫描所有包和类。

有没有办法以编程方式检索所有由Spring扫描的包,或者有没有另一种解决方案来检索非Spring bean的自定义注释类。

问候

EN

回答 1

Stack Overflow用户

发布于 2016-03-16 04:54:23

一种不需要进行完整类路径扫描的解决方案是使用AutowiredAnnotationBeanPostProcessor:

代码语言:javascript
复制
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。返回的对象可用于将类包装在代理中。因为我不需要实例,所以我将返回一个简单的新对象。这可能是一个肮脏的技巧,但它是有效的。

我必须使用这种技巧,因为所需对象的实例化将导致运行时错误,因为它必须在我使用的框架中实例化。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35975272

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档