javascript
顺序执行_执行流程 | 你真的了解Spring AOP的执行顺序吗?
Hi! 我是小小,我們又見(jiàn)面了,今天的主要內(nèi)容是,你真的了解Spring AOP的執(zhí)行順序嗎?跟隨著我的腳步,一塊丈量世界,了解世界,重新認(rèn)識(shí),重新了解Spring AOP的執(zhí)行順序。
聊一聊畢業(yè)四個(gè)月的感受
畢業(yè)四個(gè)月了,勞動(dòng)合同還沒(méi)有簽,一切都沒(méi)有穩(wěn)定下來(lái),不過(guò)也似乎也將要穩(wěn)定下來(lái)了,生活如流水一般非常平穩(wěn)的運(yùn)行著,而我的公眾號(hào)也在非常平穩(wěn)的編寫(xiě)著,當(dāng)然啦,自己最喜歡聽(tīng)的音樂(lè)也還是沒(méi)有變,MySoul,一成不變,似乎生活進(jìn)入了穩(wěn)定狀態(tài),又或者生活沒(méi)有進(jìn)入穩(wěn)定狀態(tài),我也不知道,只知道,這就是生活,唯有這樣的生活才能繼續(xù)進(jìn)行。這四個(gè)月對(duì)我感覺(jué),就是每天敲啊敲,每天的敲,拿著微薄的薪水,獲得著微薄的收入,或許這就是生活,自己的,也許這就是一個(gè)普通人,再也不能普通過(guò)的了生活了,好啦,不吐槽了,生活還需要繼續(xù)進(jìn)行下去,我們隆重的開(kāi)始今天的正文。
AOP核心概念
需要了解AOP,首先需要了解這些Spring AOP這些核心概念。
模擬aspect advice的執(zhí)行過(guò)程
在這里我們不再展示測(cè)試代碼,而是通過(guò)簡(jiǎn)單的代碼來(lái)模擬aspect advice的執(zhí)行過(guò)程。
話不多說(shuō),直接上代碼
package doubt;public class AspectAdviceInvokeProcess {
public static void main(String[] args){
try {
//正常執(zhí)行
AspectInvokeProcess(false);
System.out.println("=====分割線=====");
//異常執(zhí)行
AspectInvokeProcess(true);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 切面執(zhí)行過(guò)程
* @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;
}
}
/**
* 環(huán)繞增強(qiáng)
* @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");
}
}
/**
* 編織后的接入點(diǎn)執(zhí)行過(guò)程
* @param isException
*/
public static void JoinPoint_Proceed(boolean isException){
beforeAdvice();
targetMethod(isException);
}
/**
* 前置增強(qiáng)
*/
private static void beforeAdvice() {
System.out.println("before advice");
}
/**
* 目標(biāo)方法
* @param isException
*/
private static void targetMethod(boolean isException) {
System.out.println("target method 執(zhí)行");
if(isException)
throw new RuntimeException("異常發(fā)生");
}
/**
* 后置增強(qiáng)
*/
private static void afterAdvice() {
System.out.println("after advice");
}
/**
* 正常返回增強(qiáng)
*/
private static void afterReturningAdvice() {
System.out.println("afterReturning");
}
/**
* 異常返回增強(qiáng)
* @param e
* @throws Exception
*/
private static void afterThrowingAdvice(Exception e) throws Exception {
System.out.println("afterThrowing:"+e.getMessage());
}
}
執(zhí)行結(jié)果
上面代碼的執(zhí)行結(jié)果如下,直接體現(xiàn)了同一aspect,不同advice的執(zhí)行順序。
around before advicebefore advice
target method 執(zhí)行
around after advice
after advice
afterReturning
===============分割線==============
around before advice
before advice
target method 執(zhí)行
around after advice
after advice
afterThrowing:異常發(fā)生
java.lang.RuntimeException: 異常發(fā)生
結(jié)果圖
不同aspect,advice的執(zhí)行順序
Spring AOP 通過(guò)制定 aspect 的優(yōu)先級(jí),控制不同的 aspect,advice的執(zhí)行順序。
其中,數(shù)值越低,表明優(yōu)先級(jí)越高,@Order 默認(rèn)為最低優(yōu)先級(jí),即最大數(shù)值:
/*** Useful constant for the lowest precedence value.
* @see java.lang.Integer#MAX_VALUE
*/
int LOWEST_PRECEDENCE = Integer.MAX_VALUE;
最終,不同aspect,advice的執(zhí)行順序。
圖示
同一切面,相同接入點(diǎn)
其執(zhí)行順序不能直接確定,有如下兩種變通方式
Spring 事物管理器
Spring 事物管理器是基于Spring AOP的
切面優(yōu)先級(jí)
切面優(yōu)先級(jí),默認(rèn)為最低的優(yōu)先級(jí)
LOWEST_PRECEDENCE = Integer.MAX_VALUE關(guān)于作者
我是小小,一枚生在二線,活在一線城市的程序猿,一直致力于奮斗在一線編碼,我是小小,我們下期再見(jiàn)。
小明菜市場(chǎng)
推薦閱讀●?吊打面試官 | Java到底是值傳遞還是引用傳遞
●?容器 | Docker 如此之好,你為什么還要用k8s
●?分布式ID | 這六種分布式ID生成方法,總有一款適合你
●?數(shù)據(jù)結(jié)構(gòu)與算法 | 來(lái)來(lái)來(lái),讓我們重新認(rèn)識(shí)一下什么是樹(shù)
●?面試官 | Java轉(zhuǎn)List三種方式,你說(shuō)說(shuō)吧。我。。懵逼。啥時(shí)候有三種了
給我個(gè)好看再走好嗎?
總結(jié)
以上是生活随笔為你收集整理的顺序执行_执行流程 | 你真的了解Spring AOP的执行顺序吗?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: python以缩进对齐的方式划分语句块_
- 下一篇: php抓取aspx_哪些因素会影响蜘蛛抓