Spring源碼解析(一)開篇

前言

  Spring源碼繼承結構比較複雜,看過之後常常會忘記。所以,記錄一下源碼分析的過程,方便之後回顧。本次分析的Spring源碼版本爲3.2.15。編程

  另外,一提Spring就是IOC、DI等等,咱們先初步瞭解一下這些概念。設計模式

依賴倒置原則(Dependence Inversion Principle):面向對象設計原則的一種(抽象概念),其餘的還有單一職責原則、里氏替換原則、接口隔離原則、依賴倒置原則、迪米特原則、開-閉原則。源碼分析

控制反轉(Inversion Of Control):它是遵循依賴倒置原則設計的一種設計模式或者說設計思想(仍是停留在概念),所謂控制反轉其實就是依賴對象的獲取權被反轉了,再也不由本身控制,而是由第三方來控制。單元測試

依賴注入(Dependency Injection):依賴注入是實現控制反轉(設計思想)的一種具體實現方式。測試

依賴倒置原則(DIP)

依賴倒置原則
A.高層次的模塊不該該依賴於低層次的模塊 ,他們都應該依賴於抽象
B.抽象不該該依賴於具體實現,具體實現應該依賴於抽象。
 
舉個簡單例子理解一下:
public class ServiceA{ private ServiceB serviceB;//ServiceB是一個接口
    
    public  void toDoMethod(){ serviceB.toDo(); } public ServiceA(){ this.serviceB=new ServiceBImpl1(); } }
什麼是高層次的模塊依賴於低層次的模塊?
  ServiceA須要調用ServiceB的服務,在ServiceA的構造方法裏建立了ServiceB的實現ServiceBImpl1,這就是高層次模塊(ServiceA)依賴了底層模塊(依賴了具體實現:ServiceBImpl1),這種依賴就有個問題,若是調用ServiceA是根據不一樣場景須要調用ServiceB不一樣的實現怎麼辦呢?因此這種依賴具體實現的方式就致使ServiceA與ServiceB的具體實現耦合過高,ServiceA無法作成一個通用組件。
public class ServiceA{ private ServiceB serviceB;//ServiceB是一個接口
    
    public  void toDoMethod(){ serviceB.toDo(); } }

什麼是依賴倒置呢?this

  如上代碼所示,ServiceA中並無ServiceB具體實現,也就是所謂的ServiceA依賴了ServiceB的抽象。在編譯期ServiceA(.高層次的模塊)並無依賴低層次模塊(ServiceB的具體實現),只有真正在運行期須要ServiceB實現的時候纔會有交集,這就大大下降耦合度。spa

控制反轉(Inversion Of Control)

 依賴倒置原則只是告訴咱們不要依賴具體實現,要依賴抽象。它只是指導思想,具體怎麼去實現呢?控制反轉就是在指導思想下設計出的一套解決方案。設計

高層次模塊中只依賴低層次模塊的抽象(接口或抽象類),建立低層次模塊具體對象的事情再也不由高層次模塊負責,而是交由第三方來完成,在運行期須要的時候再經過某種方式得到低層次模塊的實現。code

到此,仍是隻停留在理論層面。對象

依賴注入(Dependency Injection)

IoC是一個很大的概念,能夠用不一樣的方式來實現。其主要實現方式有兩種:<1>依賴查找(Dependency Lookup):容器提供回調接口和上下文環境給組件。EJB和Apache Avalon都使用這種方式。<2>依賴注入(Dependency Injection):組件不作定位查詢,只提供普通的Java方法讓容器去決定依賴關係。後者是時下最流行的IoC類型,其又有接口注入(Interface Injection),設值注入(Setter Injection)和構造子注入(Constructor Injection)三種方式。

依賴注入是如今最主流的方式。由於它太主流,致使如今ioc已經約等於DI。

IOC容器

咱們提到建立依賴對象的工做由第三方來完成,這個第三方就是IOC容器,它負責理清模塊與模塊直接的依賴關係,而且負責進行依賴注入。

固然,這個容器要作的足夠靈活、可配置。

總結

依賴倒置是指導思想

    反轉控制是解決方案

        依賴注入是一種具體實施

IOC的優勢:

  1.模塊與模塊直接耦合度下降,這樣有利於團隊協做開發、單元測試。

  2.面向接口編程,系統靈活性增長。

  3.模塊直接的複雜依賴關係、對象的建立以及生命週期管理等都有容器完成。

IOC的缺點:

  1.本來簡單經過new就能夠完成的對象建立,如今須要一個複雜過程來完成。

  2.面向接口編程,靈活度加強了必然致使效率的下降。

因此說,IOC這種模式不是適合全部的系統,仍是要根據系統特色來選擇是否須要IOC模式。

相關文章
相關標籤/搜索