aop的意思的面向切面程式設計,有的業務場景都需要應用重複的**,比如登入,開啟事務,結束事務,日記記錄等等。這時候我們可以將這部分**抽象成乙個切面,然後進行注入。
我們所說的重複**就類似**a和**b。
而aop增強是對原有程式內部注入一些邏輯**來增強原有程式功能。
aop增強分為五種型別:
前置增強:在目標方法執行前面注入**進行增強。
後置增強:在目標方法執行後面注入**進行增強。
異常丟擲增強:在目標方法丟擲異常後注入**進行增強。
引介增強:在目標類中新增一些方法和屬性。
環繞增強:在目標方法執行前和執行後注入**進行增強。
環繞增強是aop聯盟的api介面,而其他四種都是spring定義的api介面。
引介增強與其他增強不同的是引介增強是針對於類的而其他增強是針對於方法。
但是spring中只支援對方法的增強
*前置增強如果出現異常會阻止目標方法的執行。
具體實現是由proxyfactory將增強類注入至原有程式的。
其實proxyfactory**技術就是利用jdk**或者cglib**的技術,將增強應用到目標類當中。
spring定義的aop proxy類具有兩個final型別的實現類,如下圖所示:
其中:cglib2aopproxy是使用cglib**技術來建立**
jdkdynamicaopproxy是使用jdk**技術來建立**
使用jdk**來實現上面的**則為:
//建立**工廠物件
proxyfactory factory=
newproxyfactory()
;//設定**介面
factory.
setinte***ces
(target.
getclass()
.getinte***ces()
);//設定**類
factory.
settarget
(target)
;//設定增強類
factory.
addadvice
(advice)
;
使用cglib**則為:
proxyfactory factory=
newproxyfactory()
;//設定**介面
factory.
setinte***ces
(target.
getclass()
.getinte***ces()
);//啟用cglib**方式
factory.
setoptimize
(true);
//設定**類
factory.
settarget
(target)
;//新增增強類
factory.
addadvice
(advice)
;
同時也可以使用配置檔案進行增強:
proxyfactory的常用屬性:
target:我們需要**的目標物件 proxyinte***ces:**所要實現的介面,可以是多個介面
interceptornames:需要織入的目標物件的bean的列表(增強類的bean列表),使用bean的名稱來指定。
singleton:確定返回的**是不是單例項的,系統預設返回的是單例項的。
optimize:當值為true時,強制使用cglib**。當是singleton的例項時我們推薦使用cglib**,當是其他作用域的時候,推薦使用jdk的**。原因是cglib建立**速度比較慢,但是執行效率高。jdk**則剛好相反。
proxytargetclass:是否對類進行**而不是對介面進行**,當值為true的時候使用cglib**
<
?xml version=
"1.0" encoding=
"utf-8"
?>
""xmlns:xsi=
"" xmlns:p=
""xsi:schemalocation=
" /spring-beans.xsd"
>
"gerrtingbefore"
class
="cn.lovepi.chapter07.aop.advice.greetingbeforeadvice"
/>
"target"
class
="cn.lovepi.chapter07.aop.advice.nativewaiter"
/>
"waiter"
class
="org.springframework.aop.framework.proxyfactorybean"
p:proxyinte***ces=
"cn.lovepi.chapter07.aop.advice.waiter"
p:interceptornames=
"gerrtingbefore"
p:target-ref=
"target"
/>
<
/beans>
對應的測試檔案:
public
class
testbeforeadvicebyxml
}
總結:
增強其實就是對原有的方法或類動態增加功能,可為方法執行前後以及所丟擲的異常進行邏輯處理。實現增強的方式有兩種:**方式和xml配置檔案方式,建議在以後開發中使用後者,這樣可以避免**的耦合度,方便後期維護。
關於AOP的一些概念
aop包含了一組自己特有的概念和術語,下列闡述一些aop的核心概念 乙個連線點是乙個程式執行過程中的特定點。典型的連線點包括對乙個方法的呼叫,方法執行的過程本身,類的初始化,物件的例項化等。連線點是aop的核心概念之一,它用來定義在程式的什麼地方能通過aop加入額外的邏輯。在某一特定的連線點處執行的...
關於C 記憶體洩漏的一些簡單理解
關於類的自定義賦值運算子和複製建構函式的重要性。反面例子 class a a private int ptr void donothing a dummy 值傳遞物件的危害 int main y越界,呼叫析構函式刪掉了y.ptr,同時x.ptr也被刪除 它們指向相同 a z 3 這條語句後,x.pt...
Block的一些簡單理解
這是我在網上學習block的時候搜尋到的博文 加入了一些自己的粗淺理解 開始引了框架的標頭檔案 import 在這裡用typedef 定義了乙個叫做compareblock,返回值為int型別引數為int a,int b的block typedef int compareblock int a,in...