Spring基礎 AOP程式設計 2

2021-09-02 16:48:38 字數 3745 閱讀 5431

[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的業務只需要關注自己業務本身,將日誌記錄 效能統計 安全控制 事務處理...