優化(解耦),通過面向介面程式設計和Spring的@Autowired自動裝載實現解耦。

2020-10-11 11:00:33

1. 常用命名規範

介面定義(IXxx,介面前加I用來區分)

  • service層介面命名:com.xxx.service.IXxxService
  • Dao層介面命名:com.xxx.dao.IXxxDao

實現類的定義(XxxImpl,名稱後面加Impl用來區分,放到對應的impl包中)

  • service層介面命名:com.xxx.service.impl.XxxServiceImpl
  • Dao層介面命名:com.xxx.dao.impl. XxxDaoImpl

2. 通過面向介面程式設計(實現模組解耦)

判斷類之間的耦合關係:最簡單的辦法,就是註釋/刪除法,將這個類中呼叫的另一個類,全部註釋掉,看看錯誤處有多少。
在這裡插入圖片描述

假設有以下類關係

public interface IPersonService{}//service介面
public class PersonServiceImpl implements IPersonService{} //service介面的實現類
public class PersonController{} //controller呼叫service

3.1 正常呼叫,controller呼叫service的實現類

public class PersonController {

    //直接呼叫介面的實現類
    PersonServiceImpl personService= new PersonServiceImpl();
    public int findPersonByName(Person person){
        return personService.findPersonByName(person);
    }
}

檢視耦合情況,我們將PersonServiceImpl類註釋掉,僅僅只是這幾行程式碼,耦合度就高達三處,肯定是不行的。
在這裡插入圖片描述

3.2 優化1,通過介面IPersonService來宣告物件,實現等號左邊解耦

public class PersonController {

    //通過呼叫介面來實現等號左邊解耦
    IPersonService personService= new PersonServiceImpl();

    public int findPersonByName(Person person) throws InterruptedException {
        return personService.findPersonByName(person);
    }
}

我們再來通過註釋PersonServiceImpl來檢視耦合情況,這時候就只有一個耦合了(等號右邊耦合)
在這裡插入圖片描述

3.3 優化2,通過Spring容器注入和自動裝載來實現等號右邊的解耦

public class PersonController {

    //通過@Autowired自動裝載,它會從容器中找對應型別的bean將其注入賦值給personService
    @Autowired
    IPersonService personService;
    //就相當於執行了 IPersonService personService= new PersonServiceImpl();

    public int findPersonByName(Person person) throws InterruptedException {
        return personService.findPersonByName(person);
    }
}

繼續通過註釋PersonServiceImpl來檢視是否有耦合情況,沒有任何報錯,所以沒有兩個類之間沒有耦合了,當前PersonController和PersonService沒有耦合了。

在這裡插入圖片描述