【问题标题】:How to make spring mutually exclusive beans?春天互斥豆子怎么做?
【发布时间】:2021-03-04 07:07:55
【问题描述】:

使用具有两个 bean 实现的接口。 一种实现有条件。

我希望它们是互斥的,从而产生单个 bean 实现接口。

尝试了以下导致缺少 bean 的方法:

interface BaseService {}

@Service
@ConditionalOnProperty(...)
class ConditionalService implements BaseService{}

class FallbackService implements BaseService {}

@Configuration
class MyConfiguration {
    @Bean
    @ConditionalOnMissingBean
    public BaseService fallbackService() {
        return new FallbackService();
    }
}

被拒绝的 github 问题和示例 repo:https://github.com/spring-projects/spring-boot/issues/24227

【问题讨论】:

  • 我试了一下,但如果您指定 @ConditionalOnProperty 中的参数类型会有所帮助。对于类似的问题,可能还值得看看this answer
  • @MikaelF 在我的测试用例中,@ConditionalOnProperty 将失败,因此不应创建 bean,应使用回退。最终结果是没有创建 bean。
  • 查看你的仓库,没有@ConditionalOnProperty,因为主要实现是用@ConditionalOnBean定义的。 Spring Boot 人员向您展示了为什么这不起作用。 @Conditional... 注释用于自动配置类。您是否在寻求帮助设置其中之一?
  • @MikaelF 是的,请提供使用自动配置的示例

标签: spring spring-boot


【解决方案1】:

在链接的 Github 问题中,来自 Spring Boot 的人员已经解释了为什么您的初始方法不起作用,所以我不会深入讨论。

Spring Boot 没有@ConditionOnMissingProperty 注释,但你可以使用@ConditonalOnExpression 模拟一个,假设你有类似@ConditionalOnProperty(name = "myproperty", havingValue = "myvalue") 的东西

@Bean
    @ConditionalOnExpression("'${myproperty}' != 'myvalue'")
    BaseService fallbackService() {
        return new FallbackService();
    }

【讨论】:

  • 这种方法的缺点是由于重复属性导致的代码维护
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-30
相关资源
最近更新 更多