我有两种应用程序,一种是另一种的特例,所以我有两层启动器,其中一个启动器为更通用的应用程序类型提供基本功能,另一个为更具体的应用程序类型提供基本功能应用。具体的继承了更一般的行为,然后根据自己的需要进行修改。
我有以下组件: SA - 一般应用程序的启动器(jar)。 SAP - 以 SA 作为依赖项和一些其他依赖项 (pom) 的一般应用程序的起始父级。 SCA - “子”启动器,以 SAP 为父(jar)。 SCAP - 更具体的应用程序的“子”启动父项,这些应用程序依赖于 SCA 和一些进一步的依赖项 (pom)。
一般应用使用 SAP 作为其父级,特定应用使用 SCAP 作为其父级。
我想在 SCA 中定义一个 bean 来替换 SA 中的一个 bean。为此,我将 ConditionalOnMissingBean 置于 SA 中的自动配置中,并在 SCA 中创建了一个具有相同名称的 bean,但我得到了 BeanDefinitionOverrideException。我不想使用主,因为我计划在 SCA 的那个 bean 上添加这个 ConditionalOnMissingBean。
我该如何解决这个问题?初学者/初学者父母的层次结构是否合适?
答案 0 :(得分:1)
听起来您需要在自动配置类上将 @AutoConfigureBefore
和/或 @AutoConfigureAfter
与 @ConditionalOnMissingBean
结合使用。
子启动器中的自动配置应该在父启动器中的自动配置之前订购。子进程可能想要替换的任何 bean 都应在父进程中使用 @ConditionalOnMissingBean
进行定义。这种安排将允许子启动器首先定义 bean。当父级中的自动配置被处理时,它将在已经定义 bean 的地方退避。
请注意,要使其正常工作,您必须使用 spring.factories
中声明的自动配置类。这在 this section of the Spring Boot reference documentation 中有更详细的描述。