javascript
Spring框架IOC和AOP的实现原理(概念)
IoC(Inversion of Control) ?
? (1). IoC(Inversion of Control)是指容器控制程序?qū)ο笾g的關(guān)系,而不是傳統(tǒng)實(shí)現(xiàn)中,由程序代碼直接操控。控制權(quán)由應(yīng)用代碼中轉(zhuǎn)到了外部容器,控制權(quán)的轉(zhuǎn)移是所謂反轉(zhuǎn)。 對于Spring而言,就是由Spring來控制對象的生命周期和對象之間的關(guān)系;IoC還有另外一個名字——“依賴注入(Dependency Injection)”。從名字上理解,所謂依賴注入,即組件之間的依賴關(guān)系由容器在運(yùn)行期決定,即由容器動態(tài)地將某種依賴關(guān)系注入到組件之中。 ?
(2). 在Spring的工作方式中,所有的類都會在spring容器中登記,告訴spring這是個什么東西,你需要什么東西,然后spring會在系統(tǒng)運(yùn)行到適當(dāng)?shù)臅r候,把你要的東西主動給你,同時也把你交給其他需要你的東西。所有的類的創(chuàng)建、銷毀都由 spring來控制,也就是說控制對象生存周期的不再是引用它的對象,而是spring。對于某個具體的對象而言,以前是它控制其他對象,現(xiàn)在是所有對象都被spring控制,所以這叫控制反轉(zhuǎn)。
(3). 在系統(tǒng)運(yùn)行中,動態(tài)的向某個對象提供它所需要的其他對象。 ?
(4). 依賴注入的思想是通過反射機(jī)制實(shí)現(xiàn)的,在實(shí)例化一個類時,它通過反射調(diào)用類中set方法將事先保存在HashMap中的類屬性注入到類中。 總而言之,在傳統(tǒng)的對象創(chuàng)建方式中,通常由調(diào)用者來創(chuàng)建被調(diào)用者的實(shí)例,而在Spring中創(chuàng)建被調(diào)用者的工作由Spring來完成,然后注入調(diào)用者,即所謂的依賴注入or控制反轉(zhuǎn)。 注入方式有兩種:依賴注入和設(shè)置注入; IoC的優(yōu)點(diǎn):降低了組件之間的耦合,降低了業(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). 實(shí)現(xiàn)AOP的技術(shù),主要分為兩大類:一是采用動態(tài)代理技術(shù),利用截取消息的方式,對該消息進(jìn)行裝飾,以取代原有對象行為的執(zhí)行;二是采用靜態(tài)織入的方式,引入特定的語法創(chuàng)建“方面”,從而使得編譯器可以在編譯期間織入有關(guān)“方面”的代碼。
(5). Spring實(shí)現(xiàn)AOP:JDK動態(tài)代理和CGLIB代理 JDK動態(tài)代理:其代理對象必須是某個接口的實(shí)現(xiàn),它是通過在運(yùn)行期間創(chuàng)建一個接口的實(shí)現(xiàn)類來完成對目標(biāo)對象的代理;其核心的兩個類是InvocationHandler和Proxy。 CGLIB代理:實(shí)現(xiàn)原理類似于JDK動態(tài)代理,只是它在運(yùn)行期間生成的代理對象是針對目標(biāo)類擴(kuò)展的子類。CGLIB是高效的代碼生成包,底層是依靠ASM(開源的java字節(jié)碼編輯類庫)操作字節(jié)碼實(shí)現(xiàn)的,性能比JDK強(qiáng);需要引入包asm.jar和cglib.jar。 ? ? 使用AspectJ注入式切面和@AspectJ注解驅(qū)動的切面實(shí)際上底層也是通過動態(tài)代理實(shí)現(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的實(shí)現(xiàn)和struts2的攔截器的實(shí)現(xiàn)都是AOP思想的體現(xiàn)。?
轉(zhuǎn):?https://www.cnblogs.com/cyhzzu/p/6644981.html
轉(zhuǎn)載于:https://www.cnblogs.com/UncleWang001/p/10642712.html
總結(jié)
以上是生活随笔為你收集整理的Spring框架IOC和AOP的实现原理(概念)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 深入理解Java的三种工厂模式
- 下一篇: openlayers5之热力图heatm