aop:aspect oriented programming,譯為面向切面程式設計。在不修改源**的情況下,通過執行時給程式新增統一功能的技術。
我覺得其中有兩層涵義:
主要功能:日誌記錄,效能統計等。
在ios中實現aop的核心技術是runtime
,使用runtime
的method swizzling
黑魔法,我們可以移花接木,在執行時將方法的具體實現添油加醋、偷梁換柱。
文章 method swizzling 庫
aspects 和 jrswizzle
aspects
+ (id
)aspect_hookselector
:(sel)selector
withoptions
:(aspectoptions)options
usingblock
:(id)block
error
:(nserror **)error;
實際為同乙個方法,這兩個方法是同名不同型別的方法,乙個是靜態類方法,乙個是成員方法。- (id)aspect_hookselector:(sel)selector
withoptions:(aspectoptions)options
usingblock:(id)block
error:(nserror **)error;
使用這個方法可以給類的例項方法新增乙個block
,並且對這個類的所有物件都會起作用。
所有的呼叫,都會是執行緒安全的。aspects
使用了objective-c
的訊息**機制,會有一定的效能消耗。所有對於過於頻繁的呼叫,不建議使用aspects
。aspects
更適用於檢視/控制器相關的等每秒呼叫不超過1000次的**。
在除錯應用時,使用aspects
動態新增日誌記錄功能。
aspectinfo) error:null];
與上一段**的微小差別是[uiviewcontroller aspect_hookselector:nsselectorfromstring(@"dealloc") withoptions:aspectpositionbefore usingblock:^(id
aspectinfo) error:null];
selector
換成了nsselectorfromstring(@"dealloc")
,而不是@selector(dealloc)
,這是因為在arc下面是不能直接手動呼叫dealloc
的,@selector(dealloc)
會被編譯器直接報錯。
通過這個log,我們可以知道viewcontroller
是否釋放,如果沒有釋放很可能就是有迴圈引用,這時你務必仔細檢查你的**,這在效能除錯和debug中非常有用。
AOP是如何實現的?
spring中的aop 還是離不開spring的ioc容器,的生成,管理及其依賴關係都是由ioc容器負責 spring預設使用jdk動態 在需要 類而不是 介面的時候,spring會自動切換為使用cglib 不過現在的專案都是面向介面程式設計,所以jdk動態 相對來說用的還是多一些。類實現invoc...
Spring中的AOP實現
aop是乙個面像切點,比如,如果寫好乙個專案後,想要繼續給其新增功能,按照以前的寫法就需要更該以前所寫好的 而aop就是把這一項缺陷所彌補 並aop面像切點只可在spring中使用 beans 3,建立好幾個測試用的類,乙個所需要插入的類,乙個提供插入的類 還有測試類,並實現裡面的方法 4,在aop...
註解實現AOP
使用註解實現aop,注意版本問題,使用註解報錯要匯入m en依賴 dependency groupid j ax.annotation groupid artifactid j ax.annotation api artifactid version 1.3.2 version dependency...