Spring核心的IOC的實體用了面向接口編程思想,因此有必要了解下。簡單來講的話,Spring就是一個輕量級的控制反轉(IOC)和麪向切面(AOP)的容器框架。html
接口的定義的概念:泛指實體把本身提供給外界的一種抽象化物(能夠爲另外一實體),用以由內部操做分離出外部溝通方法,使其能被內部修改而不影響外界其餘實體與其交互的方式。關注點:抽象化,交互。(實體提供給外部的功能抽象化成一個接口(java概念),使得內部修改不影響外部與其的交互。(關注點由具體實現轉移到接口交互))java
二. 正文 程序員
(1)先看個例子數據庫
汽車和輪胎,假設有一輛汽車Car,Bridgestone輪胎,Michelin輪胎編程
Bridgestone轉動:框架
public class Bridgestone{ public void roll() { System.out.print("Bridgestone is rolling."); } }
Michelin轉動:函數
class Michelin { public void roll() { System.out.print("Michelin is rolling"); } }
汽車轉動:單元測試
public class Car { public void roll(Bridgestone Bridgestone ) { Bridgestone.roll(); } }
(擴展性)可是若是汽車使用了Michelin輪胎,那麼汽車的代碼沒法實現,須要修改,那麼就變成以下:測試
public class Car { public void roll(Michelin michelin ) { michelin.roll(); } }
但是若是還有A,B,C等牌子的輪胎(類比喻:業務需求變化)呢,那要改無數次。很明顯這樣子的設計類之間的代碼耦合度太緊,難以複用(Car的代碼沒法在各中輪胎下複用,都須要修改),編寫單元測試困難(?:必須保證Car的roll方法被調用時候,Bridgestone的roll方法被要被調用。單元測試這塊暫時不瞭解。)spa
單元測試概念:是指對軟件中的最小可測試單元進行檢查和驗證。若是這個模塊對其餘模塊有強烈的耦合的話,會形成單元測試困難。1. 單元測試代碼須要更多的「樁」,由於單獨出來的模塊將沒法正確編譯執行,測試人員必須編寫「樁」代碼來讓模塊運行起來。2. 測試變的更加複雜,全面覆蓋更加困難。有着複雜依賴的模塊,其內部的狀態更多,沒法經過單元測試覆蓋全面,下降了測試質量。
若是將這兩種輪胎的共同特性提取出來,汽車轉動輪胎時,無須知道輪胎的特定類型(品牌,對應的子類),只要輪胎有客戶所指望的接口(roll)就好了,那樣Car的代碼擴展性好,能夠接受任意實現Trie接口的輪胎,單元測試簡單(注入實現類),代碼耦合度鬆耦合相對以前的。
interface Tire { public void roll(); } class Bridgestone implements Tire { public void roll() { System.out.print("Bridgestone is rolling."); } } class Michelin implements Tire { public void roll() { System.out.print("Michelin is rolling"); } }
public class Car { public void roll(Tire tire) {tire.roll(); }
}
以上就是面向接口編程的一個例子。
面向接口編程:面向接口意味着面向抽象,將各個實體之間的耦合程度由組件之間的耦合提高到接口層次,由接口作爲粘合劑去維護關係,讓一個實體由依賴另外一個實體,轉變成依賴一個接口,將被依賴實體的變化隔絕於接口以外。(在面向對象的系統中全部的類或者模塊之間的交互是由接口完成的。)
(1)接口就是標準規範,一種規範約束,有了標準去遵照就容易擴展!咱們只須要面向標準編程,而不用針對具體的實現類!面向接口編程好處:(1)抽象;(2)高內聚,低耦合,下降開發成本/維護成本(Car的開發者和輪胎的開發者能夠並行開發,獨立測試;替換輪胎,不須要修改Car的代碼)。
(2)協調者(接口),調用者,實現者,接口本質上就是協調者來維護實現者和調用者之間的關係。實現者和調用者都必須遵循接口的規則(標準)。
例子:JDBC,各類數據庫都按照JDBC的標準規範去開發數據庫驅動程序,程序員都按照JDBC的標準去使用訪問數據庫。好處:驅動程序編寫者不用去學接口文檔來向程序員解釋驅動程序的用法,程序員不關心具體的數據庫。
(3)高內聚,低耦合概念
高內聚低耦合是軟件設計的一個基本原則,說的是在程序的各個模塊中,儘可能讓每一個模塊獨立,相關的處理儘可能在單個模塊中完成,就是俗話說的:該幹嗎幹嗎去!優勢:能提下降各模塊的之間的聯繫,減小「牽一髮而動全身」的概率,提升開發效率,下降升級維護成本,也便於進行單元測試,提升軟件質量。
耦合性也稱塊間聯繫。指軟件系統結構中各模塊間相互聯繫緊密程度的一種度量。模塊之間聯繫越緊密,其耦合性就越強,模塊的獨立性則越差。模塊間耦合高低取決於模塊間接口的複雜性、調用的方式及傳遞的信息。
高內聚關鍵字:最充分的利用模塊中每個元素的功能,達到功能實現最大化,內聚性越強越好,用最小的資源幹最大的事情!
低耦合關鍵字:項目中的各個模塊之間的關聯要儘量的小,耦合性(相互間的聯繫)越低越好,減少「牽一髮而動全身」的可能性!
高耦合例子:一個程序有50個函數,這個程序執行得很是好;然而一旦你修改其中一個函數,其餘49個函數都須要作修改,這就是高耦合的後果。
參考資料:
CSDN:https://blog.csdn.net/u013400743/article/details/51252003
https://blog.csdn.net/qq376430645/article/details/9927225
百度知道:https://baike.baidu.com/item/%E5%8D%95%E5%85%83%E6%B5%8B%E8%AF%95/1917084?fr=aladdin
https://zhidao.baidu.com/question/271744863.html
書籍:Spring實戰第4版