[size=x-large][b]基於proxyfactory的aop程式設計[/b][/size]
spring只支援方法連線點,包括了5種型別的增強。
[list]
[*]前置增強
[*]後置增強
[*]環繞增強
[*]異常丟擲增強
[*]引介增強
[/list]
1. 前置異常
這裡使用乙個服務員作為例子,服務員向顧客打招呼,並且提供服務。首先我們建立乙個服務員的介面,然後再建立乙個不那麼友好的服務員,他直接走到顧客面前就開始提供服務了。我們應該給他們做功課,讓他們更加有禮貌一些。
public inte***ce waiter
就是這個沒什麼經驗的服務員類:
public class *****waiter implements waiter
public void serveto(string name)
}
在這裡我們給這個服務加上前置增強類,讓這個服務員在見到顧客時先打招呼:
public class greetingbeforeadvice implements methodbeforeadvice
}
用spring提供的proxyfactory進行測試:
public class testbeforeadvice
}
輸出:[color=blue]
how are you! mr.john.
greet to john..
how are you! mr.john.
serve to john..
[/color]
當然我們也可以採用spring的方式來配置增強,需要用proxyfactorybean來代替上面的proxyfactory
target:**的目標物件。
proxyinte***ces:**所要實現的介面,可以有多個。
inte***ces:是上面的屬性的別名。
interceptornames:需要織入目標物件的bean列表。
singleton:返回的**是否是單例,預設為單例。
optimize:為true時,使用cglib**,否則使用jdk**。
proxytargetclass:是否對類進行**(而不是針對介面進行**),設定為true時,使用cglib**。
讓我們來測試一下:
輸出:[color=bule]
how are you! mr.john.
greet to john..
how are you! mr.john.
serve to john..
[/color]
2. 後置增強:
在為顧客提供完服務之後,也應該有禮貌。
public class greetingafteradvice implements afterreturningadvice
}
[color=blue]
greet to john..
please enjoy yourself!
serve to john..
please enjoy yourself!
[/color]
3. 環繞增強
spring在這裡直接使用了aop聯盟的介面org.aopalliance.intercept.methodinterceptor
public class greetinginterceptor implements methodinterceptor
}
輸出:[color=blue]
how are you! mr.john.
greet to john..
please enjoy yourself!
how are you! mr.john.
serve to john..
please enjoy yourself!
[/color]
我們看到方法執行的前後都被織入了增強。
4.異常丟擲增強
public class forumservicethrowexception
public void updateforum(int forumid) throws exception
}
public class transactionmanager implements throwsadvice
}
這裡進行配置織入異常丟擲增強
[color=red]****我在採用上面的測試程式進行測試的時候,發現確實在丟擲異常之後,走到了增強之中,但是在增強**結束之後,最終異常還是會被丟擲。[/color]
4. 引介增強
引介增強和上面的增強都不太一樣,可以理解為在執行時為乙個類物件新增了新的功能,這將極大地改變我們編寫**時的思路。
這裡新增乙個新的介面,為效能監視類新增是否需要監控的功能。
public inte***ce monitorable
這裡是增強類
public class controllableperformancemonitor extends
delegatingintroductioninterceptor implements monitorable
@override
public object invoke(methodinvocation mi) throws throwable else
return obj;}}
配置檔案:
測試程式:
輸出:[color=blue]
模擬刪除forum記錄:10
模擬刪除topic記錄:1022
begin monitor...
模擬刪除forum記錄:20
end monitor...
org.springframework.aop.framework.cglibaopproxy$cglibmethodinvocation.removeforum花費20毫秒。
begin monitor...
模擬刪除topic記錄:1022
end monitor...
org.springframework.aop.framework.cglibaopproxy$cglibmethodinvocation.removetopic花費20毫秒。
[/color]
可以看到在更改可檢測屬性為true之後,增強才變的有效的。
Spring 2 Aop面向切面程式設計
後置增強 public void after joinpoint jp,object result 異常丟擲增強 相當於異常處理的finally塊 public void afterthrowing joinpoint jp,runtimeexception e 最終增強 public void a...
Spring面向切面程式設計AOP
感謝zejian 大佬的分享 關於 spring aop aspectj 你該知曉的一切 大佬的分享讓我受益匪淺!首先學習aop前,弄清楚為什麼要使用aop?舉個栗子有助於理解 乙個支付轉賬的小栗子 我們每次使用手機支付時,不管轉賬還是支付都需要驗證支付資訊密碼。這時aop的好處就體現出來了,我們可...
Spring 切面程式設計AOP註解
aop aspect oriented programming 切面程式設計通過預編譯方式和執行期動態 實現程式功能的統一維護的一種技術,是spring框架中乙個重點內容也是函式式程式設計的一種衍生范型。在spring中使用aop的業務只需要關注自己業務本身,將日誌記錄 效能統計 安全控制 事務處理...