2017-06-07 36 views
3

@ComponentScan會給你一個包含@Component註釋的所有類的列表(或@Service/@Repository)。要做到這一點,我想他們使用反射來枚舉包中的所有類,並找到具有該註釋的類。ComponentScan如何工作?

但是根據other StackOverflow answers,由於ClassLoader的工作原理,無法可靠地枚舉包中的所有類。那麼@ComponentScan看起來如何實現這一目標?

+0

藉助[ClassPathScanningCandidateComponentProvider](http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/context/annotation/ClassPathScanningCandidateComponentProvider.html) – harshavmb

+0

上面的類有一個方法'findCandidateComponents '接受'basePackage'作爲輸入參數,然後'ResourcePatternResolver'實例讀取所有具有'.class'後綴的類路徑文件。希望這可以幫助! – harshavmb

回答

1

@ComponentScan的工作原理是不同的。工作流程是把此前不久:

  • 查找同一文件夾中的所有.class文件和所有子文件夾
  • 閱讀的.class文件,並將其包裝成Resource對象
  • 檢查類有註釋,這將使它很好的候選人
  • 如果class是很好的候選者,那麼從它創建bean。

從春源代碼類看:

  • ComponentScanAnnotationParser
  • AnnotationConfigUtils
  • ClassPathBeanDefinitionScanner
  • BeanDefinitionReaderUtils
  • DefaultListableBeanFactory