【springboot】介面多實現類,選擇性注入的4種解決方案

aa111111發表於2022-03-17

一、問題的描述

在實際的系統應用開發中我經常會遇到這樣的一類需求,相信大家在工作中也會經常遇到:


同一個系統在多個省份部署。

一個業務在北京是一種實現方式,是基於北京使用者的需求。

同樣的業務在上海是另外一種實現方式,與北京的實現方式大同小異

遇到這樣的需求,我們通常會定義一個業務實現的介面,比如:


public interface IDemoService {

  public void doSomething();

}

1

2

3

在北京環境下這樣實現,比如:


@Component

public class DemoServiceBeijing implements IDemoService {

  @Override

  public void doSomething() {System.out.println("北京的業務實現");}

}

1

2

3

4

5

在上海環境下這樣實現,比如:


@Component

public class DemoServiceShanghai implements IDemoService {

  @Override

  public void doSomething() {System.out.println("上海的業務實現");}

}

1

2

3

4

5

然後我們寫一個模擬業務測試用例


@SpringBootTest

class DemoApplicationTests {

    //這裡注入的demoService是DemoServiceShanghai,還是DemoServiceBeijing?

    @Resource

    IDemoService demoService;  

    @Test

    void testDemoService() {

        demoService.doSomething();

    }

}

1

2

3

4

5

6

7

8

9

10

當我們執行這個測試用例的時候一定會報錯,因為Spring發現了兩個IDemoService的實現類。它不知道去例項化哪一個實現類,來作為IDemoService的實際業務處理bean。當然我們期望的狀態是:


在北京部署系統的時候,使用DemoServiceBeijing作為IDemoService的實現類完成依賴注入

在上海部署系統的時候,使用DemoServiceShanghai作為IDemoService的實現類完成依賴注入

二、相對低階解決方案

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



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70010128/viewspace-2871535/,如需轉載,請註明出處,否則將追究法律責任。

相關文章