簡體   English   中英

@Autowired基於application.properties中的屬性

[英]@Autowired based on a property inside application.properties

假設我有幾個實現單個接口的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
}

如何將正確的依賴項注入到我可以在application.properties文件中指定的Yoyo服務中?

myApp.haha=impl1

我可以創建一個配置,但是然后我將不得不刪除@Component注釋,這是我不想要的,因為在Haha實現類中,我將注入其他bean(服務,控制器等):

@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 ,是因為@ConditionalOnProperty可以出現在方法或類型上

解決方案是從所有Haha實現類中刪除@Component批注。

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

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

@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()
}

application.properties

myApp.haha=impl1
#myApp.haha=impl2

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM