[英]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.