我定义了带有注解配置的类

    @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'metricsEndpoint',

    {"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}中包含任何指定的类时,条件将匹配。

谁能告诉我为什么

最佳答案

@ConditionalOnBean的javadoc将其描述为:


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


在这种情况下,关键部分是“已包含在BeanFactory中”。在任何自动配置类之前,都将考虑您自己的配置类。这意味着在您自己的配置检查其存在时,尚未发生MetricsEndpoint bean的自动配置,因此,未创建MetricsFormatEndpoint bean。

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

07-24 09:20