如何扫描来自两个不同包的组件?例如,如果我想从包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");
简短的回答是,不能在一次调用中扫描多个包,但可以随意多次调用ClassPathScanningCandidateComponentProvider.findCandidateComponents
。你不应该担心这里的开销。
例如,在Spring内部使用的ClassPathBeanDefinitionScanner
有一个scan
方法,它接受String (String... basePackages
)的变量,然后在findCandidateComponents
上循环。
ClassPathScanningCandidateComponentProvider
委托给ResourcePatternResolver
(在我们的例子中是PathMatchingResourcePatternResolver
)来查找我们将从中读取元数据的所有Resource's
。要做到这一点,它使用PathMather
(在我们的例子中是AntPathMatcher
)和一个默认模式,附加到我们的basePackage
: **/*.class
。
如果你想要更精确的东西,在一次调用中完成所有的事情,你必须编写自己的ResourcePatternResolver
。如果我是你,在扫描2个包的情况下,我只会调用ClassPathScanningCandidateComponentProvider.findCandidateComponents
2次,而忘记这一点开销。当然,如果您要进行大量调用并希望尽可能减少开销,那么编写自己的ResourcePatternResolver
可能会对您有所帮助。