spring boot裏,掃描的class對象是用註解@ComponentScan(未指定的情況下默認是main函數所在package)來指定的。
然後通過類ComponentScanAnnotationParser來讀取這些packages,交給ClassPathScanningCandidateComponentProvider來掃描這些類,找到package下所有類的活默認是由PathMatchingResourcePatternResolver來完成的,其實最終還是有jdk裏ClassLoader類的getResources方法來做。
這個getResources方法有個path參數,就是指定目錄的,如果爲空字符或者".",找的是classpath的跟路徑,如果指定了路徑名,會尋找classpath的路徑還有jar文件。
PathMatchingResourcePatternResolver就是通過去遞歸classpath路徑來找所有類的,而對於jar,找到類所屬jar文件後,用JarFile類便可以讀取文件裏所有的類。
對於第三方的包,spring boot是不會主動去掃描的,如果第三方包裏有想向spring註冊的bean的話,在META-INF目錄下放置一個spring.factories的文件,用org.springframework.boot.autoconfigure.EnableAutoConfiguration來指定一個配置類就可以了。