假设我有几个实现单个接口(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上。