我定义了带有注解配置的类
@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之后评估其条件。