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



如何扫描来自两个不同包的组件?例如,如果我想从包com.googlecom.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可能会对您有所帮助。

最新更新