IoC(Inversion of Control):
(1)IoC(Inversion of Control)是指容器控制程序?qū)ο笾g的關(guān)系臀规,而不是傳統(tǒng)實現(xiàn)中,由程序代碼直接操控栅隐∷遥控制權(quán)由應(yīng)用代碼中轉(zhuǎn)到了外部容器,控制權(quán)的轉(zhuǎn)移是所謂反轉(zhuǎn)约啊。對于Spring而言邑遏,就是由Spring來控制對象的生命周期和對象之間的關(guān)系;IoC還有另外一個名字——“依賴注入(Dependency Injection)”恰矩。從名字上理解记盒,所謂依賴注入,即組件之間的依賴關(guān)系由容器在運行期決定外傅,即由容器動態(tài)地將某種依賴關(guān)系注入到組件之中纪吮。
(2)在Spring的工作方式中,所有的類都會在spring容器中登記萎胰,告訴spring這是個什么東西碾盟,你需要什么東西,然后spring會在系統(tǒng)運行到適當(dāng)?shù)臅r候技竟,把你要的東西主動給你冰肴,同時也把你交給其他需要你的東西。所有的類的創(chuàng)建榔组、銷毀都由 spring來控制熙尉,也就是說控制對象生存周期的不再是引用它的對象,而是spring搓扯。對于某個具體的對象而言检痰,以前是它控制其他對象,現(xiàn)在是所有對象都被spring控制锨推,所以這叫控制反轉(zhuǎn)铅歼。
(3)在系統(tǒng)運行中,動態(tài)的向某個對象提供它所需要的其他對象换可。
(4)依賴注入的思想是通過反射機(jī)制實現(xiàn)的椎椰,在實例化一個類時,它通過反射調(diào)用類中set方法將事先保存在HashMap中的類屬性注入到類中沾鳄。
總而言之俭识,在傳統(tǒng)的對象創(chuàng)建方式中,通常由調(diào)用者來創(chuàng)建被調(diào)用者的實例洞渔,而在Spring中創(chuàng)建被調(diào)用者的工作由Spring來完成套媚,然后注入調(diào)用者,即所謂的依賴注入or控制反轉(zhuǎn)磁椒。
注入方式有兩種:依賴注入和設(shè)置注入堤瘤;
IoC的優(yōu)點:降低了組件之間的耦合,降低了業(yè)務(wù)對象之間替換的復(fù)雜性浆熔,使之能夠靈活的管理對象本辐。
AOP(Aspect Oriented Programming):
(1)AOP面向方面編程基于IoC,是對OOP的有益補(bǔ)充医增;
(2)AOP利用一種稱為“橫切”的技術(shù)慎皱,剖解開封裝的對象內(nèi)部,并將那些影響了多個類的公共行為封裝到一個可重用模塊叶骨,并將其名為“Aspect”茫多,即方面。所謂“方面”忽刽,簡單地說天揖,就是將那些與業(yè)務(wù)無關(guān),卻為業(yè)務(wù)模塊所共同調(diào)用的邏輯或責(zé)任封裝起來跪帝,比如日志記錄今膊,便于減少系統(tǒng)的重復(fù)代碼,降低模塊間的耦合度伞剑,并有利于未來的可操作性和可維護(hù)性斑唬。
(3)AOP代表的是一個橫向的關(guān)系,將“對象”比作一個空心的圓柱體黎泣,其中封裝的是對象的屬性和行為恕刘;則面向方面編程的方法,就是將這個圓柱體以切面形式剖開聘裁,選擇性的提供業(yè)務(wù)邏輯雪营。而剖開的切面,也就是所謂的“方面”了衡便。然后它又以巧奪天功的妙手將這些剖開的切面復(fù)原献起,不留痕跡,但完成了效果镣陕。
(4)實現(xiàn)AOP的技術(shù)谴餐,主要分為兩大類:一是采用動態(tài)代理技術(shù),利用截取消息的方式呆抑,對該消息進(jìn)行裝飾岂嗓,以取代原有對象行為的執(zhí)行;二是采用靜態(tài)織入的方式鹊碍,引入特定的語法創(chuàng)建“方面”厌殉,從而使得編譯器可以在編譯期間織入有關(guān)“方面”的代碼食绿。
(5)Spring實現(xiàn)AOP:JDK動態(tài)代理和CGLIB代理
JDK動態(tài)代理:其代理對象必須是某個接口的實現(xiàn),它是通過在運行期間創(chuàng)建一個接口的實現(xiàn)類來完成對目標(biāo)對象的代理公罕;其核心的兩個類是InvocationHandler和Proxy器紧。
CGLIB代理:實現(xiàn)原理類似于JDK動態(tài)代理,只是它在運行期間生成的代理對象是針對目標(biāo)類擴(kuò)展的子類楼眷。CGLIB是高效的代碼生成包铲汪,底層是依靠ASM(開源的java字節(jié)碼編輯類庫)操作字節(jié)碼實現(xiàn)的,性能比JDK強(qiáng)罐柳;需要引入包asm.jar和cglib.jar掌腰。
使用AspectJ注入式切面和@AspectJ注解驅(qū)動的切面實際上底層也是通過動態(tài)代理實現(xiàn)的。
(6)AOP使用場景:
Authentication 權(quán)限檢查
Caching 緩存
Context passing 內(nèi)容傳遞
Error handling 錯誤處理
Lazy loading 延遲加載
Debugging 調(diào)試
logging, tracing, profiling and monitoring 日志記錄张吉,跟蹤齿梁,優(yōu)化,校準(zhǔn)
Performance optimization 性能優(yōu)化芦拿,效率檢查
Persistence 持久化
Resource pooling 資源池
Synchronization 同步
Transactions 事務(wù)管理
另外Filter的實現(xiàn)和struts2的攔截器的實現(xiàn)都是AOP思想的體現(xiàn)士飒。
總結(jié):
(1)spring有以下的優(yōu)點:
1.降低了組件之間的耦合性 ,實現(xiàn)了軟件各層之間的解耦
2.可以使用容易提供的眾多服務(wù)蔗崎,如事務(wù)管理酵幕,消息服務(wù)等
3.容器提供單例模式支持
4.容器提供了AOP技術(shù),利用它很容易實現(xiàn)如權(quán)限攔截缓苛,運行期監(jiān)控等功能
5.容器提供了眾多的輔助類芳撒,能加快應(yīng)用的開發(fā)
6.spring對于主流的應(yīng)用框架提供了集成支持,如hibernate未桥,JPA笔刹,Struts等
7.spring屬于低侵入式設(shè)計,代碼的污染極低
8.獨立于各種應(yīng)用服務(wù)器
9.spring的DI機(jī)制降低了業(yè)務(wù)對象替換的復(fù)雜性
10.Spring的高度開放性冬耿,并不強(qiáng)制應(yīng)用完全依賴于Spring舌菜,開發(fā)者可以自由選擇spring的部分或全部
(2)AOP可以動態(tài)的添加或者刪除在切面上的邏輯而不影響原來代碼的執(zhí)行,體現(xiàn)了源代碼無關(guān)性亦镶。