我可以扩展一个@Component 并创建另一个@Component 类并且一次只提供一个类吗?

jis*_*non 4 java inheritance spring-boot

我有一个库 jar,我想提供给许多应用程序。我想要的行为是在库中创建一个通用的 spring 组件类。如果在应用程序中没有扩展相同的组件,则使用公共组件;如果它在应用程序中扩展,则使用扩展组件(子类)。这可能吗?- 仅当该类的子项不存在时才创建 CommonComponent。

我使用的是 Java 1.8, Springboot2.0

在库中创建类:

@Component
public class CommonComponent{}
Run Code Online (Sandbox Code Playgroud)

在使用该库的其中一个子应用程序中,我添加了一个子组件:

@Component
public class ChildComponent extends CommonComponent{}
Run Code Online (Sandbox Code Playgroud)

我希望创建一个组件 ChildComponent;但在上面的场景中,创建了 2 个组件 - CommonComponent 和 ChildComponent。

Tod*_*odd 6

您可以这样做的一种方法是利用@ConditionalOnMissingBeanSpring Boot的注释。当与类中的 bean 定义结合使用时@Configuration,我们可以告诉 Spring 仅在尚未定义 bean 的情况下才定义它。

这是未经测试的:

@Configuration
public class CustomComponentConfiguration {

    @ConditionalOnMissingBean(CustomComponent.class)
    @Bean
    public CustomComponent customComponent() {
        return new CustomComponent();
    }
}
Run Code Online (Sandbox Code Playgroud)

在这个例子中,当我们@Configuration运行时,Spring 确定是否有任何其他 bean 是CustomComponent. 如果没有,它将执行该customComponent()方法并定义您返回的任何 bean。因此,如果其他人定义了 a ChildComponent,则不会调用此方法。