1.下降了組件之間的耦合性 ,實現了軟件各層之間的解耦
2.可使用容易提供的衆多服務,如事務管理,消息服務等
3.容器提供單例模式支持
4.容器提供了AOP技術,利用它很容易實現如權限攔截,運行期監控等功能
5.容器提供了衆多的輔助類,能加快應用的開發
6.spring對於主流的應用框架提供了集成支持,如hibernate,JPA,Struts等
7.spring屬於低侵入式設計,代碼的污染極低
8.獨立於各類應用服務器
9.spring的DI機制下降了業務對象替換的複雜性
10.Spring的高度開放性,並不強制應用徹底依賴於Spring,開發者能夠自由選擇spring的部分或所有 java
IOC,即控制反轉(Inversion of Control),他與依賴注入(Dependecy Injection)是同一個概念。具體的講:當某個角色須要另一個角色協助的時候,在傳統的程序設計過程當中,一般由調用者來建立被調用者的實例。但在spring中 建立被調用者的工做再也不由調用者來完成,所以稱爲控制反轉。建立被調用者的工做由spring來完成,而後注入調用者所以也稱爲依賴注入。 spring
它並非一種技術實現,而是一種設計思想。在任何一個有實際開發意義的程序項目中,咱們會使用不少類來描述它們特有的功能,而且經過類與類之間的相互協做來完成特定的業務邏輯。這個時候,每一個類都須要負責管理與本身有交互的類的引用和依賴,代碼將會變的異常難以維護和極度的高耦合。而IOC的出現正是用來解決這個問題,咱們經過IOC將這些相互依賴對象的建立、協調工做交給Spring容器去處理,每一個對象只須要關注其自身的業務邏輯關係就能夠了。在這樣的角度上來看,得到依賴的對象的方式,進行了反轉,變成了由spring容器控制對象如何獲取外部資源(包括其餘對象和文件資料等等)。數據庫
舉例:某一天,你生病了,可是你不清楚本身到底得了什麼病,你只知道本身頭疼,咳嗽,全身無力。這個時候你決定去藥店買藥,藥店有不少種藥,僅僅是治療頭疼就有好幾十種,還有西藥中藥等區別。而後你本身看了看說明書,選擇了一盒你本身以爲最能治療本身病症的藥,付錢吃藥,期待能夠早點好起來。
可是這個過程,對於一個病人來講,太辛苦了。頭疼,咳嗽,全身無力,還要一個個的看藥品說明書,一個個的比較哪一個藥比較好,簡直是太累了。這個時候,你決定直接去醫院看醫生。
醫生給你作了檢查,知道你的病症是什麼,有什麼緣由引發的;同時醫生很是瞭解有哪些藥能治療你的病痛,而且能根據你的自身狀況進行篩選。只須要短短的十幾分鍾,你就能拿到對症下藥的藥品,即省時又省力。編程
在上面這個例子中,IOC起到的就是醫生的做用,它收集你的需求要求,而且對症下藥,直接把藥開給你。你就是對象,藥品就是你所須要的外部資源。經過醫生,你不用再去找藥品,而是經過醫生把藥品開給你。這就是整個IOC的精髓所在。安全
Spring以動態靈活的方式來管理對象 , 注入的兩種方式,設置注入和構造注入。
設置注入的優勢:直觀,天然
構造注入的優勢:能夠在構造器中決定依賴關係的順序。 服務器
AOP:面向切面編程,每每被定義爲促使軟件系統實現關注點的分離的技術。系統是由許多不一樣的組件所組成的,每個組件各負責一塊特定功能。除了實現自身核心功能以外,這些組件還常常承擔着額外的職責。例如日誌、事務管理和安全這樣的核心服務常常融入到自身具備核心業務邏輯的組件中去。這些系統服務常常被稱爲橫切關注點,由於它們會跨越系統的多個組件。app
AOP的概念不像IOC同樣實例化舉例,如今咱們以一個系統中的具體實現來說講AOP具體是個什麼技術。框架
咱們以系統中經常使用到的事務管控舉例子。在系統操做數據庫的過程當中,不可避免地要考慮到事務相關的內容。若是在每個方法中都新建一個事務管理器,那麼無疑是對代碼嚴重的耦合和侵入。爲了簡化咱們的開發過程(實際上spring所作的一切實現都是爲了簡化開發過程),須要把事務相關的代碼抽成出來作爲一個獨立的模塊。經過AOP,確認每個操做數據庫方法爲一個鏈接點,這些鏈接點組成了一個切面。當程序運行到其中某個一個切點時,咱們將事務管理模塊順勢織入對象中,經過通知功能,完成整個事務管控的實現。這樣一來,全部的操做數據庫的方法中不須要再單獨關心事務管理的內容,只須要關注自身的業務代碼的實現便可。全部的事務管控相關的內容都經過AOP的方式進行了實現。簡化了代碼的內容,將目標對象複雜的內容進行解耦,分離業務邏輯與橫切關注點。oop
下面介紹一下AOP相關的術語:spa
一、通知: 通知定義了切面是什麼以及什麼時候使用的概念。Spring 切面能夠應用5種類型的通知:
二、鏈接點:是在應用執行過程當中可以插入切面的一個點。
三、切點: 切點定義了切面在何處要織入的一個或者多個鏈接點。
四、切面:是通知和切點的結合。通知和切點共同定義了切面的所有內容。
五、引入:引入容許咱們向現有類添加新方法或屬性。
六、織入:是把切面應用到目標對象,並建立新的代理對象的過程。切面在指定的鏈接點被織入到目標對象中。在目標對象的生命週期中有多個點能夠進行織入:
面向切面編程(AOP)完善spring的依賴注入(DI),面向切面編程在spring中主要表現爲兩個方面:
面向切面編程(aop)是對面向對象編程(oop)的補充, 面向對象編程將程序分解成各個層次的對象,面向切面編程將程序運行過程分解成各個切面。
AOP從程序運行角度考慮程序的結構,提取業務處理過程的切面,oop是靜態的抽象,aop是動態的抽象, 是對應用執行過程當中的步驟進行抽象,,從而得到步驟之間的邏輯劃分。
AOP框架具備的兩個特徵:
IOC:控制反轉也叫依賴注入,IOC利用java反射機制,AOP利用代理模式。所謂控制反轉是指,原本被調用者的實例是有調用者來建立的,這樣的缺點是耦合性太強,IOC則是統一交給spring來管理建立,將對象交給容器管理,你只須要在spring配置文件總配置相應的bean,以及設置相關的屬性,讓spring容器來生成類的實例對象以及管理對象。在spring容器啓動的時候,spring會把你在配置文件中配置的bean都初始化好,而後在你須要調用的時候,就把它已經初始化好的那些bean分配給你須要調用這些bean的類。
AOP:面向切面編程。(Aspect-Oriented Programming)
AOP能夠說是對OOP的補充和完善。OOP引入封裝、繼承和多態性等概念來創建一種對象層次結構,用以模擬公共行爲的一個集合。實現AOP的技術,主要分爲兩大類:一是採用動態代理技術,利用截取消息的方式,對該消息進行裝飾,以取代原有對象行爲的執行;二是採用靜態織入的方式,引入特定的語法建立「方面」,從而使得編譯器能夠在編譯期間織入有關「方面」的代碼,屬於靜態代理。
若是還不明白,放棄java吧!