[英]Efficiently scan classpath with spring for two packages
如何一次扫描两个不同包装中的组件? 例如,如果我想从包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
上findCandidateComponents
。
长的答案是ClassPathScanningCandidateComponentProvider
委托给ResourcePatternResolver
(在我们的示例中为PathMatchingResourcePatternResolver
)来查找将要从中读取元数据的所有Resource's
。 为此,它使用PathMather
(在我们的示例中为AntPathMatcher
)和默认模式,该模式附加在basePackage
: **/*.class
basePackage
后面。
如果您想要更精确的内容并一次调用即可完成所有操作,则必须编写自己的ResourcePatternResolver
。 如果您是我,则在扫描2个程序包的情况下,我将只调用2次ClassPathScanningCandidateComponentProvider.findCandidateComponents
,而ClassPathScanningCandidateComponentProvider.findCandidateComponents
了很少的开销。 当然,如果您要进行大量调用并且希望将开销降到最低,也许编写自己的ResourcePatternResolver
可能会对您有所帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.