溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

spring自動注入接口的多個實現類是怎樣的

發(fā)布時間:2021-11-15 14:49:04 來源:億速云 閱讀:212 作者:柒染 欄目:大數據

這篇文章給大家介紹spring自動注入接口的多個實現類是怎樣的,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

在使用spring開發(fā)的時候,有時候會出現一個接口多個實現類的情況,但是有沒有有時候有這樣一種情況,就是你的邏輯代碼里面還不知道你需要使用哪個實現類,就是比如說:你去按摩,按摩店里面有幾種會員打折,比如有,vip、svip和普通用戶,那按摩店里面是不是需要對這些會員定義好不同的折扣,然后根據每個用戶不同的會員計算出不同的消費情況

雖然這樣的情況,對于一般人來說,第一眼肯定就是說,直接加 if else 去判斷就可以了

這樣做,對于實現功能而言,肯定是沒問題,如果以后這個按摩店又增加一種會員,那你是不是又要去修改你的邏輯代碼去在加一個 if else ,這樣就違反了系統架構設計的開閉原則,這樣寫if else  也使你的代碼看起來不優(yōu)雅。

所以在代碼里面,我們可以先定義一個DiscountStrategy接口類

public interface DiscountStrategy {

    public String getType();

    public double disCount(double fee);

}

然后在寫他的幾個實現類

普通用戶實現類

@Service

public class NormalDisCountService implements  DiscountStrategy {

    public String getType(){

        return "normal";

    }

    public double disCount(double fee){

        return fee * 1;

    }

}

會員實現類

public class VipDisCountService  implements  DiscountStrategy{

    public String getType(){

        return "vip";

    }

    public double disCount(double fee){

        return fee * 0.8;

    }

}

svip超級會員實現類

@Service

public class SVipDisCountService  implements  DiscountStrategy {

    public String getType(){

        return "svip";

    }

    public double disCount(double fee){

        return fee * 0.5;

    }

}

然后當一個用戶進來消費的時候,根據你當前的身份去打折扣

定義一個map集合,然后把所有的實現類都放入到這個集合中,然后根據當前的會員類型去進行不同的操作

@Service

public class DisCountStrageService {

    Map<String,DiscountStrategy> discountStrategyMap = new HashMap<>();

    // 構造函數,如果你是集合接口對象,那么就會把spring容器中所有關于該接口的子類,全部抓出來放入到集合中

    public DisCountStrageService(List<DiscountStrategy> discountStrategys){

        for (DiscountStrategy discountStrategy: discountStrategys) {

            discountStrategyMap.put(discountStrategy.getType(),discountStrategy);

        }

    }

    public double disCount(String type,Double fee){

        DiscountStrategy discountStrategy =discountStrategyMap.get(type);

        return discountStrategy.disCount(fee);

    }

}

測試類

@RunWith(SpringRunner.class)

@SpringBootTest

public class MzySpringModeApplicationTests {

    @Autowired

    OrderService orderService;

    @Autowired

    DisCountStrageService disCountStrageService;

    @Test

    public void contextLoads() {

        //orderService.saveOrder();

        double vipresult = disCountStrageService.disCount("vip",100d);

        double svipresult = disCountStrageService.disCount("svip",100d);

        double normalresult = disCountStrageService.disCount("normal",100d);

        System.out.println(vipresult);

        System.out.println(svipresult);

        System.out.println(normalresult);

    }

}

其實這就是java設計模式的策略模式,只不過就是用構造函數注入到list集合中

就算以后按摩店繼續(xù)增加了一種會員體系,比如黑卡用戶,只需要去寫一個接口的實現類,而不需要去修改以前的代碼,這也沒有違反系統架構的開閉原則(對修改關閉,對擴展開放)

注意:上面這種方式只能適用于springboot項目,對于以前的那種springmvc模式不支持,會報錯,因為以前的方式注入是通過配置文件去注入的,需要去修改一個applicationContext的配置文件

關于spring自動注入接口的多個實現類是怎樣的就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI