为什么conditionalOnBean不起作用

时间:2015-08-04 02:48:58

标签: spring-boot spring-bean

我定义了一个带注释配置的类

@Configuration
@AutoConfigureAfter(EndpointAutoConfiguration.class)
public class EndpointConfiguration {
    @Resource
    private MetricsEndpoint metricsEndpoint;

    @Bean
    public MetricsFormatEndpoint metricsFormatEndpoint() {
        return new MetricsFormatEndpoint(metricsEndpoint);
    }
}

MetricsFormatEndpoint效果很好。

但我使用注释conditionalOnBean,它根本不起作用。

@Bean
@ConditionalOnBean(MetricsEndpoint.class)
public MetricsFormatEndpoint metricsFormatEndpoint() {
    return new MetricsFormatEndpoint(metricsEndpoint);
}

参见localhost:8080 / beans,spring applicationContext有bean'mempisionEndpoint',

{"bean":"metricsEndpoint","scope":"singleton",
 "type":"org.springframework.boot.actuate.endpoint.MetricsEndpoint",
 "resource":"class path resource 
[org/springframework/boot/actuate/autoconfigure/EndpointAutoConfiguration.class]",
"dependencies":[]}

我读了注释@ConditionalOnBean的文档,它说应该检查的bean的类类型。当指定的任何类包含在{@link ApplicationContext}中时,条件匹配。

谁能告诉我原因

2 个答案:

答案 0 :(得分:11)

@ConditionalOnBean的javadoc将其描述为:

  

Conditional仅在指定的bean类和/或名称已包含在BeanFactory中时才匹配。

在这种情况下,关键部分已经包含在BeanFactory"中。在任何自动配置类之前都会考虑您自己的配置类。这意味着在您自己的配置检查其存在时,MetricsEndpoint bean的自动配置没有发生,因此,您的MetricsFormatEndpoint bean不会出现这种情况。创造了。

一种方法是MetricsFormatEndpoint bean的create your own auto-configuration class,并使用@AutoConfigureAfter(EndpointAutoConfiguration.class)对其进行注释。这将确保在定义MetricsEndpoint bean之后评估其条件。

答案 1 :(得分:0)

ConditionalOnClass也很好。

Javadoc表示应在其他specified auto-configuration类之后应用AutoConfigureAfter。

当指定的类位于类路径上时,

和ConditionalOnClass匹配。我认为这是合适的