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


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

原因:

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

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

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

(4)將簡單的組件配置、組合成為復雜的應用,也就是框架的作用

框架與類庫的區別:

(1)框架一般是封裝了邏輯、高內聚的,類庫則是松散的工具組合

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

 

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

 

 

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。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM