簡體   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