java Spring@ConditionalOnBean未找到bean的
我使用的是spring boot:2.5.7
我的应用程序中有一个启动程序不起作用。 我打开代码是为了理解原因并注意到一个奇怪的行为:
起动器代码为:
自动配置:
@Configuration
@EnableConfigurationProperties(MyConfigProperties.class)
public class MyCompanyAutoConfiguration {
@Bean
@ConditionalOnBean(MyConfigProperties.class)
public MeterRegistry defaultNewRelicMeterRegistry(MyConfigProperties config) {
System.out.println("called method");
return MyCompanyNewRelicRegistry.builder(config).build();
}
}
地产股
@Configuration
@ConfigurationProperties(prefix = "company.config.newrelic")
@ConditionalOnProperty(prefix = "company.config.newrelic", name = "apiKey")
@ConditionalOnClass(NewRelicRegistryConfig.class)
public class MyConfigProperties implements NewRelicRegistryConfig {
// getters and setters
...
}
工厂文件(spring.factories)
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.company.MyCompanyAutoConfiguration
当我启动我的应用程序时,MyCompanyNewRelicRegistry bean没有被创建
我发现“ConditionalOnBean”是问题所在,当使用此注释时,代码不打印“called method”。这很奇怪,因为MyConfigProperties bean已经初始化(我看到在容器启动后调用applicationContext.getBean)
当我删除注释@ConditionalOnBean时,一切正常,方法被调用
为什么ConditionalOnBean当时没有找到MyConfigProperty
注意:在其他条件下使用的所有属性和类都可以
#更新
我改为:
@Configuration
@EnableConfigurationProperties
@ComponentScan
public class MyCompanyAutoConfiguration {
@Bean
@ConditionalOnBean(MyConfigProperties.class)
public MeterRegistry defaultNewRelicMeterRegistry(MyConfigProperties config) {
System.out.println("called method");
return MyCompanyNewRelicRegistry.builder(config).build();
}
}
上面的例子有效
我在日志中看到,spring尝试首先加载“defaultNewRelicMeterRegistry”,当评估conditionalBean时,它还没有创建
当我移除ConditionalOnBean时,spring将加载属性以注入它
组件可以“强制”spring在自动配置类中声明的bean之前加载所有其他bean吗
共 (0) 个答案