Spring bean的返回类型的具体类型或接口?

时间:2018-04-16 08:30:40

标签: spring spring-boot

我目前对Bean注册和创建感到困惑。我的问题是我有一个带有2个实现的接口,但在运行时只注册了1个Bean。 这可以通过各种条件来确保。 当创建一个具体的bean时,我想创建另一个bean。但是当我返回接口类型时,这不起作用。

一个简短的例子

xs_danger_btn_to

因此,如果创建了Foo2,我会期望创建Foo2HealthIndicator,但不是。 也许有人可以提示为什么不。

如果我将bean注册从接口返回类型更改为具体的类类型,它可以正常工作。

interface Foo{
 String bar()
}

class Foo1 implements Foo
class Foo2 implements Foo

@Configuration
BarConfiguration


@ConditionalOnMissingBean
@ConditionalOnProperty( value = "my.enabled", havingValue = "false" )
Foo foo1(){
return Foo1();
}

@ConditionalOnMissingBean
Foo foo2(){
return Foo2();
}

@ConditonalOnBean(Foo2.class)
Foo2HealthIndicator foo2HealthIndicator(Foo2 foo2){

//todo something
}

有人可以向我解释为什么界面类型不起作用?或者给我一个相应的文档?

1 个答案:

答案 0 :(得分:0)

ConditionalOnMissingBean javadoc

  

只有在BeanFactory中尚未包含指定的bean类和/或名称时才匹配的条件。

因此,在您的第一个示例中,foo2 bean未注册,因为已经注册了一个。

解决方案是删除ConditionalOnMissingBean注释。