有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案