我定义了一个带注释配置的类
@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}中时,条件匹配。
谁能告诉我原因
答案 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匹配。我认为这是合适的