Spring Boot @ConditionalOnProperty 不加载 bean

Spring Boot @ConditionalOnProperty doesn't load bean

我正在尝试实施一项服务,该服务将根据 env 变量使用两个不同的存储库。

基于本文:https://reflectoring.io/dont-use-spring-profile-annotation/

我想使用带有 @ConditionalOnProperty 注释的配置在启动时加载适当的实现。

我完全按照文章中的方式做了所有事情,但是 spring 抛出一个异常,提示未定义 bean:

Description:

Parameter 0 of method myService in com.adam.MyServiceConfiguration required a bean of type 'com.adam.MyRepository' that could not be found.


Action:

Consider defining a bean of type 'com.adam.MyRepository' in your configuration.


Process finished with exit code 0

这里是服务的配置:

@Configuration
class MyServiceConfiguration {
    @Bean
    fun mySerivce(myRepository: MyRepository) = MyService(myRepository)
}

这里是存储库 bean 的配置:

@Configuration
class DataSourceConfiguration {

    @Bean
    @ConditionalOnProperty(
        prefix = "datasource",
        name = ["mock"],
        havingValue = "false",
        matchIfMissing = true
    )
    fun myRepository(httpClient: HttpClient): MyRepository =
        HttpRepository(httpClient)

    @Bean
    @ConditionalOnProperty(
        prefix = "datasource",
        name = ["mock"],
        havingValue = "true"
    )
    fun myRepository(): MyRepository = InMemoryRepository()
}

有人能看出我做错了什么吗?我为此苦苦挣扎了几个小时。

我尝试使用@DependsOn,但错误是没有定义该名称的 bean。

我还启用了日志记录,如果我没看错,应该正确解析 bean:

   My#repository:
      Did not match:
         - @ConditionalOnProperty (datasource.mock=false) found different value in property 'mock' (OnPropertyCondition)
      Matched:
         - @ConditionalOnProperty (datasource.mock=true) matched (OnPropertyCondition)

您在一个 @Configuration class 上有两个名为 myRepository@Bean 方法。这意味着有两种不同的方法都定义了一个名为 myRepository 的 bean。这混淆了 Spring 框架的条件评估,如 this issue 中所述。混淆意味着在定义单个 myRepository bean 时评估两个 myRepository() 方法的条件。你的两个条件是互斥的,所以没有定义bean。

您可以通过确保两个 @Bean 方法具有不同的名称来解决此问题。例如,您可以将它们命名为 httpRepositoryinMemoryRepository.