如何通过一次扫描从两个不同的包中扫描组件?例如,如果我想从包com.google
和com.apple
进行扫描而不必进行两次扫描?我总是可以扫描com
,但看起来效率不高。我目前正在使用Spring 4.2。
ClassPathScanningCandidateComponentProvider scanner = new ClassPathScanningCandidateComponentProvider(false);
scanner.addIncludeFilter(new AnnotationTypeFilter(Controller.class));
Set<BeanDefinition> candidateComponents = scanner.findCandidateComponents("com");
答案 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
可以帮助您。