2015-09-16 55 views
0

如何用一次掃描掃描兩個不同軟件包中的組件?例如,如果我想從包com.googlecom.apple進行掃描而不必進行兩次掃描?我總是可以掃描com,但它似乎不會很有效。我目前使用Spring 4.2。用兩個軟件包有效掃描classpath

ClassPathScanningCandidateComponentProvider scanner = new ClassPathScanningCandidateComponentProvider(false); 
scanner.addIncludeFilter(new AnnotationTypeFilter(Controller.class)); 
Set<BeanDefinition> candidateComponents = scanner.findCandidateComponents("com"); 

回答

2

答案是,你可以在一個呼叫不掃描多個包,但隨時來電ClassPathScanningCandidateComponentProvider.findCandidateComponents多次。你不應該擔心這裏的開銷。

例如ClassPathBeanDefinitionScanner它是由彈簧在內部使用具有scan方法,其接受一組字符串的可變參數(String... basePackages),然後在findCandidateComponents循環。

答案是ClassPathScanningCandidateComponentProvider委託給ResourcePatternResolver(在我們的情況下,PathMatchingResourcePatternResolver)來找到我們所要讀的元數據的所有Resource's。爲此,它使用PathMather(在我們的情況下爲AntPathMatcher)和默認模式,並附加到我們的basePackage**/*.class

如果你想要更精確的事情,並在一次通話中做所有事情,你將不得不編寫自己的ResourcePatternResolver。如果我是你,在掃描2個包的情況下,我只需要撥打2個電話ClassPathScanningCandidateComponentProvider.findCandidateComponents,並忘記了小開銷。當然,如果您打算打很多電話,想要儘可能少的開銷,也許可以編寫自己的ResourcePatternResolver來幫助您。