使用spring有效扫描两个包的类路径

时间:2015-09-16 20:42:55

标签: java spring classpath

如何通过一次扫描从两个不同的包中扫描组件?例如,如果我想从包com.googlecom.apple进行扫描而不必进行两次扫描?我总是可以扫描com,但看起来效率不高。我目前正在使用Spring 4.2。

ClassPathScanningCandidateComponentProvider scanner =  new ClassPathScanningCandidateComponentProvider(false);
scanner.addIncludeFilter(new AnnotationTypeFilter(Controller.class));
Set<BeanDefinition> candidateComponents = scanner.findCandidateComponents("com");

1 个答案:

答案 0 :(得分:2)

简短答案是您无法在一次通话中扫描多个包,但可以多次拨打ClassPathScanningCandidateComponentProvider.findCandidateComponents。你不应该担心这里的开销。

例如,Spring内部使用的ClassPathBeanDefinitionScanner有一个scan方法,它接受一个字符串变量(String... basePackages),然后循环findCandidateComponents

答案是ClassPathScanningCandidateComponentProvider委托给ResourcePatternResolver(在我们的案例中为PathMatchingResourcePatternResolver)以查找所有Resource's我们将阅读元数据。为此,它使用PathMather(在我们的示例中为AntPathMatcher)和默认模式,附加到basePackage**/*.class

如果你想要更精确的东西并在一次通话中做所有事情,你必须自己编写ResourcePatternResolver。如果我是你,在扫描2个软件包的情况下,我只会进行ClassPathScanningCandidateComponentProvider.findCandidateComponents的2次调用,而忘记了一点开销。当然,如果您打算拨打大量电话并希望尽可能减少开销,那么编写自己的ResourcePatternResolver可以帮助您。