繁体   English   中英

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

[英]Efficiently scan classpath with spring for two packages

如何一次扫描两个不同包装中的组件? 例如,如果我想从包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 )的可变参数,然后在findCandidateComponentsfindCandidateComponents

长的答案是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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM