假设我有几个实现单个接口(interface)的Spring组件:

interface Haha
@Component class HahaImpl1: Haha {
   @Autowired lateinit var repo: JpaRepository<Data, Long>
}
@Component class HahaImpl2: Haha

@Service
class Yoyo {
   @Autowired lateinit var haha: Haha
}

如何将正确的依赖项注入(inject)到Yoyo文件中可以指定的application.properties服务中?
myApp.haha=impl1

我可以创建一个配置,但是随后我将不得不删除我不想要的@Component批注,因为在Haha实现类中,我将注入(inject)其他bean(服务, Controller 等):
@Configuration
class MyConfiguration {
    @Bean
    @ConditionalOnProperty(name = ["myApp.haha"], havingValue = "impl1", matchIfMissing = true)
    fun config1(): Haha = HahaImpl1()

    @Bean
    @ConditionalOnProperty(name = ["myApp.haha"], havingValue = "impl2")
    fun config2(): Haha = HahaImpl2()
}

有任何想法吗?谢谢。

最佳答案

您可以通过将@ConditionalOnProperty移至bean类并完全删除@Configuration类(或至少删除处理HaHa实例的部分)来解决问题:

interface HaHa

@Component
@ConditionalOnProperty(name = "myApp.haha", havingValue = "impl1", matchIfMissing = true)
class HahaImpl1: Haha {
    @Autowired
    lateinit var repo: JpaRepository<Data, Long>
}

@Component
@ConditionalOnProperty(name = "myApp.haha", havingValue = "impl2")
class HahaImpl2: Haha {
    // ...
}

这样一来,您总是仅根据是否存在属性来获得HaHa的一个实例。这是可行的,因为@ConditionalOnProperty可以出现在Method or a Type上。

08-05 18:34