【问题标题】:Using ClassPathScanningCandidateComponentProvider and excluding special directory使用 ClassPathScanningCandidateComponentProvider 并排除特殊目录
【发布时间】:2017-06-29 06:27:04
【问题描述】:

我想使用ClassPathScanningCandidateComponentProvider 来搜索一个类的不同子类。但是在这种情况下我需要排除一个特殊的目录。

例子:

目录/包:

src/main/java/frstPck/scndPck
src/test/java/frstPck/scndPck

扫描代码:

public static void example() throws ClassNotFoundException {
    ClassPathScanningCandidateComponentProvider provider = new ClassPathScanningCandidateComponentProvider(false);
    provider.addIncludeFilter(new AssignableTypeFilter(Super.class));

    Set<BeanDefinition> components = provider.findCandidateComponents("frstPck/scndPck");
    for (BeanDefinition component : components) {
        Class<?> cls = Class.forName(component.getBeanClassName());
        System.out.print(cls.getSimpleName());
    }
}

问题是,classpathscanning 也会找到src/test/java 的子类,而这不应该发生。有没有可能排除这些?

【问题讨论】:

标签: java spring eclipse classpath scanning


【解决方案1】:

这个问题很老,但答案可以帮助别人。

如果您的测试类名称的末尾默认包含“Test”一词,您可以通过按如下名称创建过滤器来排除它们:

provider.addExcludeFilter(new RegexPatternTypeFilter(Pattern.compile(".*Test")))

然后会是这样的:

public static void example() throws ClassNotFoundException {
    ClassPathScanningCandidateComponentProvider provider = new ClassPathScanningCandidateComponentProvider(false);
    provider.addIncludeFilter(new AssignableTypeFilter(Super.class));
    provider.addExcludeFilter(new RegexPatternTypeFilter(Pattern.compile(".*Test")));

    Set<BeanDefinition> components = provider.findCandidateComponents("frstPck/scndPck");
    for (BeanDefinition component : components) {
        Class<?> cls = Class.forName(component.getBeanClassName());
        System.out.print(cls.getSimpleName());
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-02
    • 2011-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-27
    相关资源
    最近更新 更多