javascript
gtw-050090|执行拦截器时发生异常_执行流程 | 你真的了解Spring AOP的执行顺序吗?...
Hi! 我是小小,我們又見面了,今天的主要內容是,你真的了解Spring AOP的執行順序嗎?跟隨著我的腳步,一塊丈量世界,了解世界,重新認識,重新了解Spring AOP的執行順序。
聊一聊畢業四個月的感受
畢業四個月了,勞動合同還沒有簽,一切都沒有穩定下來,不過也似乎也將要穩定下來了,生活如流水一般非常平穩的運行著,而我的公眾號也在非常平穩的編寫著,當然啦,自己最喜歡聽的音樂也還是沒有變,MySoul,一成不變,似乎生活進入了穩定狀態,又或者生活沒有進入穩定狀態,我也不知道,只知道,這就是生活,唯有這樣的生活才能繼續進行。這四個月對我感覺,就是每天敲啊敲,每天的敲,拿著微薄的薪水,獲得著微薄的收入,或許這就是生活,自己的,也許這就是一個普通人,再也不能普通過的了生活了,好啦,不吐槽了,生活還需要繼續進行下去,我們隆重的開始今天的正文。
AOP核心概念
需要了解AOP,首先需要了解這些Spring AOP這些核心概念。
模擬aspect advice的執行過程
在這里我們不再展示測試代碼,而是通過簡單的代碼來模擬aspect advice的執行過程。
話不多說,直接上代碼
package doubt;public class AspectAdviceInvokeProcess {
public static void main(String[] args){
try {
//正常執行
AspectInvokeProcess(false);
System.out.println("=====分割線=====");
//異常執行
AspectInvokeProcess(true);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 切面執行過程
* @param isException
* @throws Exception
*/
public static void AspectInvokeProcess(boolean isException) throws Exception{
try {
try {
aroundAdvice(isException);
} finally {
afterAdvice();
}
afterReturningAdvice();
return;
} catch (Exception e) {
afterThrowingAdvice(e);
throw e;
return;
}
}
/**
* 環繞增強
* @param isException
* @throws Exception
*/
private static void aroundAdvice(boolean isException) throws Exception {
System.out.println("around before advice");
try {
JoinPoint_Proceed(isException);
} finally {
System.out.println("around after advice");
}
}
/**
* 編織后的接入點執行過程
* @param isException
*/
public static void JoinPoint_Proceed(boolean isException){
beforeAdvice();
targetMethod(isException);
}
/**
* 前置增強
*/
private static void beforeAdvice() {
System.out.println("before advice");
}
/**
* 目標方法
* @param isException
*/
private static void targetMethod(boolean isException) {
System.out.println("target method 執行");
if(isException)
throw new RuntimeException("異常發生");
}
/**
* 后置增強
*/
private static void afterAdvice() {
System.out.println("after advice");
}
/**
* 正常返回增強
*/
private static void afterReturningAdvice() {
System.out.println("afterReturning");
}
/**
* 異常返回增強
* @param e
* @throws Exception
*/
private static void afterThrowingAdvice(Exception e) throws Exception {
System.out.println("afterThrowing:"+e.getMessage());
}
}
執行結果
上面代碼的執行結果如下,直接體現了同一aspect,不同advice的執行順序。
around before advicebefore advice
target method 執行
around after advice
after advice
afterReturning
===============分割線==============
around before advice
before advice
target method 執行
around after advice
after advice
afterThrowing:異常發生
java.lang.RuntimeException: 異常發生
結果圖
不同aspect,advice的執行順序
Spring AOP 通過制定 aspect 的優先級,控制不同的 aspect,advice的執行順序。
其中,數值越低,表明優先級越高,@Order 默認為最低優先級,即最大數值:
/*** Useful constant for the lowest precedence value.
* @see java.lang.Integer#MAX_VALUE
*/
int LOWEST_PRECEDENCE = Integer.MAX_VALUE;
最終,不同aspect,advice的執行順序。
圖示
同一切面,相同接入點
其執行順序不能直接確定,有如下兩種變通方式
Spring 事物管理器
Spring 事物管理器是基于Spring AOP的
切面優先級
切面優先級,默認為最低的優先級
LOWEST_PRECEDENCE = Integer.MAX_VALUE關于作者
我是小小,一枚生在二線,活在一線城市的程序猿,一直致力于奮斗在一線編碼,我是小小,我們下期再見。
小明菜市場
推薦閱讀●?吊打面試官 | Java到底是值傳遞還是引用傳遞
●?容器 | Docker 如此之好,你為什么還要用k8s
●?分布式ID | 這六種分布式ID生成方法,總有一款適合你
●?數據結構與算法 | 來來來,讓我們重新認識一下什么是樹
●?面試官 | Java轉List三種方式,你說說吧。我。。懵逼。啥時候有三種了
給我個好看再走好嗎?
總結
以上是生活随笔為你收集整理的gtw-050090|执行拦截器时发生异常_执行流程 | 你真的了解Spring AOP的执行顺序吗?...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: .net 窗体清除上次显示的内容_acc
- 下一篇: 样式图片_中式门窗花格图片大全样式全面选