为什么我不对我的自动配置进行组件扫描?

Why shall I not component-scan my auto-configuration?

Spring Boot's documentation 中明确指出必须通过 spring.factories 文件指定自动配置:

Auto-configurations must be loaded that way only. Make sure that they are defined in a specific package space and that they are never the target of component scanning.

我确实尝试在我的自动配置 class 上放置一个 @Component 并确保它会被组件扫描拾取。好像还行。

虽然我确实认为这是一种不好的做法,因为组件扫描不太可能在现实世界的场景中真正发现它,但我想知道为什么文档对此有如此强烈的感觉。还有其他我没有预料到的危险吗?如果有,是哪一种?

编辑: 在 https://youtu.be/jDchAEHIht0?t=734 中,Stéphane 和 Brian 解释说有两个阶段,一个称为“UserConfiguration Phase”,另一个称为“AutoConfiguration Phase”。按照这个想法会建议,在自动配置 class 上使用 @ComponentScan 会将其移至“用户配置阶段”,这基本上会破坏自动配置的语义。

但是,我在实验中一直无法破解它。只要我保留我的 @Conditional 注释,它似乎就能按预期工作...

It seems to work.

您可能会怀疑,文档中出现该说明是有充分理由的。 auto-configuration 的全部意义在于,一旦用户配置被解析,它们就会被处理,原因很简单,顺序很重要。

如果您有一个配置为 类 的应用程序生成了一堆 bean,并且您想确保 auto-configuration 中的某个 bean 在用户表达意见后不会被创建,你需要确保这个 auto-configuration 在用户配置之后被处理。您分享的视频对此进行了更详细的描述,我建议您观看完整部分。

Are there any other dangers that I fail to anticipate, and if so, which?

希望上面的解释和你自己的编辑告诉你。 Auto-configurations 不是用户配置。在组件扫描中声明它们是用户配置的教科书。