Spring是什麼+控制反轉和依賴注入

Spring是一個開源框架,是一個輕量級的控制反轉(IOC)和麪向切面(AOP)的容器框架。編程

緣由:框架

(1)經過控制反轉(IOC)達到鬆耦合,IOC也就是把控制權交出去,在使用中直接獲得對象函數

(2)提供了面向切面編程的豐富支持,容許經過分離應用的業務邏輯與系統級服務進行內聚性的開發(例如,商品的入庫和出庫是業務邏輯,而商品的入庫和出庫須要統一的日誌記錄和事務的管理是系統服務,與具體的業務無關,也就是不管業務如何,都要用到系統服務)工具

(3)包含並管理應用對象的配置和生命週期,也就是容器的做用spa

(4)將簡單的組件配置、組合成爲複雜的應用,也就是框架的做用.net

框架與類庫的區別:日誌

(1)框架通常是封裝了邏輯、高內聚的,類庫則是鬆散的工具組合xml

(2)框架專一於某一領域,類庫則是更通用的對象

 

Spring是一系列輕量級Java EE框架的集合:核心容器,Spring上下文,Spring AOP, Spring DAO, Spring ORM, Spring Web, Spring MVC。blog

 

 

IOC:控制反轉,控制權的轉移,應用程序自己不負責依賴對象的建立和維護,而是由外部容器負責建立和維護,也就是不顯示的進行new建立對象

DI(依賴注入):是控制反轉的一種實現方式,由IOC容器在運行期間,動態地將某種依賴關係注入到對象之中。也就是得到依賴對象的過程由自身管理變爲由IOC容器主動注入。經過反射機制實現。

 

控制反轉:

控制反轉的目的:建立對象並組裝對象之間的關係。

IOC容器初始化時建立一系列對象,並把對象之間的依賴關係經過注入的方式組織起來,當一個類A中有另一個B,實例化時,先實例化A這個對象,再實例化B這個對象,而後把B這個對象賦值給A,這就是IOC的組裝對象,具體以下圖

圖解:業務對象進入Spring容器,而後經過配置的元數據,生產出符合咱們須要的對象,當咱們須要用的時候,直接從Spring容器中取出來用便可,這也就是IOC,應用程序只關心對象的使用,而不關心對象的建立

 

在IOC容器中,把全部對象稱爲Bean,Spring利用Bean來管理這些對象,Spring對於Bean和其餘的使用有兩種方式,一種是基於xml的配置,一種是註解方式。

 

依賴注入:

借鑑http://blog.csdn.net/zhoudaxia/article/details/31763677

控制反轉:把傳統上由程序代碼直接操控的對象的調用權交給外部容器,經過容器來實現對象組件的裝配和管理。所謂的「控制反轉」就是組件對象的控制權轉移了,從程序代碼自己轉移到了外部容器。

實現控制反轉的兩種方式:依賴注入和依賴查找。

依賴注入有四種實現方式:

1.基於接口:實現特定接口以供外部容器注入所依賴類型的對象,接口中定義要注入依賴對象的方法。

2.基於setter方法:實現特定屬性的public set方法,來讓外部容器調用,以傳入所依賴類型的對象。

3.基於構造函數:實現特定參數的構造函數,在新建對象時傳入所依賴類型的對象。

4.基於註解:基於Java的註解功能,在私有變量前加「@Autowired"等註解,不須要顯式的定義以上三種代碼,即可以讓外部容器傳入對應的對象。該方案至關於定義了public 的set方法,可是由於沒有真正的set方法,從而不會爲了實現依賴注入致使暴露了不應暴露的接口(由於set方法只想讓容器訪問來注入而不但願其餘依賴此類的對象訪問)。

 

 

 Spring注入:

Spring注入是指在啓動Spring容器加載bean配置的時候,完成對變量的賦值行爲。即在IOC容器加載配置文件的過程當中,會掃描相關配置,併爲這些bean實例化,也就是建立對象,注入就是隨着建立的過程,完成對成員變量的賦值,例如在A類中聲明瞭一個B類,注入就是指IOC容器在初始化A的時候就把A的成員變量B進行賦值。

經常使用的兩種注入方式:

(1)設值注入

  經過成員變量的set方法進行注入,xml配置文件中的配置:

  

  這裏也就是injectionDAO是injectionService中的一個屬性,並且injectionService中必須有injectionDAO的set方法,由於context容器會自動調用對其進行賦值

(2)構造注入

  xml配置文件以下:

  

  構造方法以下:

  

 

  與設值注入其餘配置相似,只是這裏要求injectionService中,必定要有構造方法,且構造方法的參數名要是injectionDAO,在IOC容器調用InjectionServiceImpl的構造方法去建立這個類的實例的同時,就會把InjectionDAOImpl的實例賦值給injectionService中聲明的構造方法中的參數injectionDAO。

相關文章
相關標籤/搜索