【问题标题】:How does ComponentScan work?ComponentScan 是如何工作的?
【发布时间】:2017-11-08 06:40:12
【问题描述】:

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

但是根据other StackOverflow answers,由于ClassLoader 的工作方式,您无法可靠地枚举包中的所有类。那么@ComponentScan 似乎是如何做到这一点的呢?

【问题讨论】:

  • 上述类有一个方法findCandidateComponents接受basePackage作为输入参数,然后ResourcePatternResolver实例读取所有带有.class后缀的类路径文件。希望这会有所帮助!
  • @harshavmb,如果你把你的评论变成答案,我会投赞成票。
  • @NoelYap,你真好!我觉得现在把它作为我几乎忘记 Java 和 Spring 的答案已经太晚了。很抱歉让您失望了!

标签: java spring reflection annotations component-scan


【解决方案1】:

@ComponentScan 的工作方式不同。工作流程很快就放在这里:

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

从 Spring 源代码中查看的类:

  • ComponentScanAnnotationParser
  • AnnotationConfigUtils
  • ClassPathBeanDefinitionScanner
  • BeanDefinitionReaderUtils
  • DefaultListableBeanFactory

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-26
    • 1970-01-01
    • 2021-04-08
    • 2017-03-14
    • 2020-12-31
    • 2018-12-26
    • 2016-06-02
    • 2016-05-01
    相关资源
    最近更新 更多