ComponentScan如何工作?

Dav*_*ica 8 java reflection spring annotations component-scan

@ComponentScan将为您提供@Component包含(或@Service/ @Repository)注释的所有类的列表.为此,我想他们使用反射来枚举包中的所有类,并找到具有该注释的类.

但是,根据其他StackOverflow答案,由于ClassLoader工作原理,您无法可靠地枚举包中的所有类.那么@ComponentScan看似如何设法实现这一目标呢?

小智 5

@ComponentScan工作方式不同。工作流不久就这样:

  • 在同一文件夹和所有子文件夹中查找所有.class文件
  • 读取.class文件并将其包装到Resource对象中
  • 检查类是否具有使其成为候选者的注释
  • 如果类是好的候选者,则从中创建bean。

从Spring源代码中的类来看:

  • ComponentScanAnnotationParser
  • AnnotationConfigUtils
  • ClassPathBeanDefinitionScanner
  • BeanDefinitionReaderUtils
  • DefaultListableBeanFactory