亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

springboot接口多實現(xiàn)類選擇性注入解決方案

 更新時間:2022年03月08日 15:07:36   作者:字母哥哥  
這篇文章主要為大家介紹了springboot接口多實現(xiàn)類選擇性注入解決方案的四種方式,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步

一、問題的描述

在實際的系統(tǒng)應用開發(fā)中我經(jīng)常會遇到這樣的一類需求,相信大家在工作中也會經(jīng)常遇到:

同一個系統(tǒng)在多個省份部署。

一個業(yè)務(wù)在北京是一種實現(xiàn)方式,是基于北京用戶的需求。

同樣的業(yè)務(wù)在上海是另外一種實現(xiàn)方式,與北京的實現(xiàn)方式大同小異

遇到這樣的需求,我們通常會定義一個業(yè)務(wù)實現(xiàn)的接口,比如:

public interface IDemoService {
  public void doSomething();
}

在北京環(huán)境下這樣實現(xiàn),比如:

@Component
public class DemoServiceBeijing implements IDemoService {
  @Override
  public void doSomething() {System.out.println("北京的業(yè)務(wù)實現(xiàn)");}
}

在上海環(huán)境下這樣實現(xiàn),比如:

@Component
public class DemoServiceShanghai implements IDemoService {
  @Override
  public void doSomething() {System.out.println("上海的業(yè)務(wù)實現(xiàn)");}
}

然后我們寫一個模擬業(yè)務(wù)測試用例

@SpringBootTest
class DemoApplicationTests {
    //這里注入的demoService是DemoServiceShanghai,還是DemoServiceBeijing?
    @Resource
    IDemoService demoService;  
    @Test
    void testDemoService() {
        demoService.doSomething();
    }
}

當我們執(zhí)行這個測試用例的時候一定會報錯,因為Spring發(fā)現(xiàn)了兩個IDemoService的實現(xiàn)類。它不知道去實例化哪一個實現(xiàn)類,來作為IDemoService的實際業(yè)務(wù)處理bean。當然我們期望的狀態(tài)是:

在北京部署系統(tǒng)的時候,使用DemoServiceBeijing作為IDemoService的實現(xiàn)類完成依賴注入

在上海部署系統(tǒng)的時候,使用DemoServiceShanghai作為IDemoService的實現(xiàn)類完成依賴注入

二、相對低級解決方案

面對上面的需求,先說幾個相對低級的解決方案,這幾個方案雖然可以實現(xiàn)我們期望的狀態(tài),但是對運維不夠友好。

2.1. 方案一:使用@Primary注解

假如在北京部署系統(tǒng)的時候,在DemoServiceBeijing的類上面加上@Primary,該注解的作用就是強迫從多個實現(xiàn)類里面選一個實現(xiàn)類,如果Spring不知道選哪一個,我們告訴它一個默認的。

2.2. 方案二:使用@Resource注解

因為@Resource注解默認使用名稱進行依賴注入,所以變量名明確叫做demoServiceBeijing(首字母小寫),使用的就是DemoServiceBeijing實現(xiàn)類。

@Resource
IDemoService demoServiceBeijing;  //這里的變量名稱指定了bean名稱
//IDemoService demoService;  被替換掉

或者

@Resource(name = "demoServiceBeijing")  //使用resource注解明確指定名稱
IDemoService demoService;

2.3.方案三:使用@Qualifier注解

與上文同樣的道理,使用@Qualifier注解,指定bean的名稱進行依賴注入

@Qualifier("demoServiceBeijing")  //使用Qualifier注解明確指定名稱
@Resource
IDemoService demoService;

上面所提到的三個方案雖然都可以解決:在不同的部署環(huán)境下使用不同的接口實現(xiàn)類完成依賴注入的問題。但是這樣不好,因為一旦我們要把部署環(huán)境從beijing(北京)換成shanghai(上海),就需要把上面的注解的位置或者內(nèi)容全都修改一遍(所有的實現(xiàn)類代碼都要修改)。

三、相對高級的解決方案

我們提出進一步的期望:就是只修改一個配置就能完成部署環(huán)境切換的操作。比如:

deploy:
  province: beijing

當我們期望把部署環(huán)境從北京切換到上海的時候,只需要將上文配置中的beijing 改成 shanghai ,這該怎么實現(xiàn)呢?

在北京的實現(xiàn)類上面加上ConditionalOnProperty注解,havingValue的值為beijing

@Component
@ConditionalOnProperty(value="deploy.province",havingValue = "beijing")
public class DemoServiceBeijing implements IDemoService {

在上海的實現(xiàn)類上面加上ConditionalOnProperty注解,havingValue的值為shanghai

@Component
@ConditionalOnProperty(value="deploy.province",havingValue = "shanghai")
public class DemoServiceShanghai implements IDemoService {

ConditionalOnProperty注解在這里的作用就是:讀取配置文件發(fā)現(xiàn)deploy.province,并將該配置的值與havingValue匹配,匹配上哪一個就實例化哪一個類作為該接口的實現(xiàn)類bean注入到Spring容器中(當然注入過程需要配合@Component注解實現(xiàn))

以上就是springboot接口多實現(xiàn)類選擇性注入解決方案的詳細內(nèi)容,更多關(guān)于springboot接口多實現(xiàn)類選擇性注入的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Feign遠程調(diào)用丟失請求頭問題

    Feign遠程調(diào)用丟失請求頭問題

    本文介紹了在服務(wù)端項目中如何解決資源訪問限制問題,首先介紹了問題的產(chǎn)生,然后詳細解析了源碼,最后提出了解決方案,解決方案包括同步和異步兩種,同步時直接向Spring容器注入RequestInterceptor攔截器
    2024-09-09
  • springboot+thymeleaf+shiro標簽的實例

    springboot+thymeleaf+shiro標簽的實例

    這篇文章主要介紹了springboot+thymeleaf+shiro標簽的實例,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • springboot集成mybatis?plus和dynamic-datasource注意事項說明

    springboot集成mybatis?plus和dynamic-datasource注意事項說明

    這篇文章主要介紹了springboot集成mybatis?plus和dynamic-datasource注意事項說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • 淺談SpringBoot內(nèi)嵌Tomcat的實現(xiàn)原理解析

    淺談SpringBoot內(nèi)嵌Tomcat的實現(xiàn)原理解析

    這篇文章主要介紹了淺談SpringBoot內(nèi)嵌Tomcat的實現(xiàn)原理解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-12-12
  • servlet的url-pattern匹配規(guī)則詳細描述(小結(jié))

    servlet的url-pattern匹配規(guī)則詳細描述(小結(jié))

    在利用servlet或Filter進行url請求的匹配時,很關(guān)鍵的一點就是匹配規(guī)則。這篇文章主要介紹了servlet的url-pattern匹配規(guī)則詳細描述(小結(jié)),非常具有實用價值,需要的朋友可以參考下
    2018-07-07
  • ElasticSearch?深度分頁示例解析

    ElasticSearch?深度分頁示例解析

    這篇文章主要為大家介紹了ElasticSearch?深度分頁示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-02-02
  • Java自定義簡單標簽實例

    Java自定義簡單標簽實例

    Java自定義簡單標簽可以方便的在頁面輸出信息,并且對于權(quán)限的控制,和對于Jsp標簽和servlet代碼的分離有著很好的作用
    2013-07-07
  • Springboot中useGeneratedKeys用法小結(jié)

    Springboot中useGeneratedKeys用法小結(jié)

    本文主要介紹了Springboot中useGeneratedKeys用法小結(jié),useGeneratedKeys?是 MyBatis 框架中的一個參數(shù),用于指定是否允許 JDBC 支持自動生成主鍵,感興趣的可以了解一下
    2024-09-09
  • springcloud如何配置文件加載順序

    springcloud如何配置文件加載順序

    這篇文章主要介紹了springcloud如何配置文件加載順序問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • java中jdk的下載和安裝全過程

    java中jdk的下載和安裝全過程

    這篇文章主要給大家介紹了關(guān)于java中jdk的下載和安裝的相關(guān)資料,文中通過圖文介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-11-11

最新評論