ConditionalOnMissingBean 和分层启动器

ConditionalOnMissingBean and hierachical starters

我有两种应用程序,一种是另一种的特例,所以我有两层启动器,其中一个启动器为更通用的应用程序类型提供基本功能,另一个为更具体的应用程序类型提供基本功能应用类型。具体的继承更通用的行为,然后根据自己的需要修改。

我有以下组件: SA - 通用应用程序 (jar) 的启动器。 SAP - starter parent 用于以 SA 作为依赖项和一些其他依赖项 (pom) 的一般应用程序。 SCA - “child”启动器,SAP 为 parent (jar)。 SCAP - “child”启动程序 parent 用于依赖于 SCA 和一些进一步依赖项 (pom) 的更具体的应用程序。

一般应用使用 SAP 作为它们的 parent,特定应用使用 SCAP 作为它们的 parent。

我想在 SCA 中定义一个将替换 SA 中的 bean 的 bean。为此,我将 ConditionalOnMissingBean 放入 SA 的自动配置中,并在 SCA 中创建了一个同名的 bean,但我得到了 BeanDefinitionOverrideException。我不想使用主要的,因为我计划在 SCA 的那个 bean 上也添加这个 ConditionalOnMissingBean。

我该如何解决这个问题? starters/starter parent 的层次结构是否合适?

听起来您需要在自动配置 类 上结合使用 @AutoConfigureBefore and/or @AutoConfigureAfter@ConditionalOnMissingBean

子启动器中的自动配置应该在父启动器中的自动配置之前排序。子级可能想要替换的任何 beans 都应该在父级中用 @ConditionalOnMissingBean 定义。这种安排将允许 child starter 首先定义 bean。当处理父级中的自动配置时,它将在已定义 bean 的位置退回。

请注意,要使其正常工作,您必须使用在 spring.factories 中声明的自动配置 类。这在 this section of the Spring Boot reference documentation.

中有更详细的描述