AspectJ基本語法和意義

AspectJ是一種面向切面編程(AOP)語言赞草,它可以用于在Java代碼中定義和使用切面。下面是AspectJ的基本語法和意義:

下面是AspectJ的完整語法:

  1. 切面聲明

切面聲明用于定義一個切面類映琳,其中包含切點和通知。切面類必須包含@Aspect注釋雅任。

@Aspect
public class MyAspect {
    // 切點和通知
}
  1. 切點

切點用于定義在何處應用通知罕扎。它可以是一個方法調用,一個字段訪問庆锦,一個對象創(chuàng)建等等捅位。

@Pointcut("execution(* com.example.MyClass.myMethod(..))")
public void myPointcut() {}

上面的代碼定義了一個切點,它匹配com.example.MyClass類的myMethod方法搂抒。

  1. 通知

通知用于在切點匹配時執(zhí)行某些代碼艇搀。AspectJ支持五種類型的通知:

  • @Before:在方法執(zhí)行前執(zhí)行代碼。
  • @After:在方法執(zhí)行后執(zhí)行代碼求晶,無論是否拋出異常焰雕。
  • @AfterReturning:在方法執(zhí)行后執(zhí)行代碼,僅在方法成功返回時執(zhí)行芳杏。
  • @AfterThrowing:在方法拋出異常時執(zhí)行代碼矩屁。
  • @Around:環(huán)繞通知,可以在方法執(zhí)行前和執(zhí)行后執(zhí)行代碼爵赵。
@Before("myPointcut()")
public void myBeforeAdvice() {
    // 在切點匹配時執(zhí)行代碼
}

上面的代碼定義了一個@Before通知吝秕,它在myPointcut切點匹配時執(zhí)行myBeforeAdvice方法。

  1. 連接點

連接點是在程序執(zhí)行期間切點匹配的實際位置空幻。例如烁峭,在方法調用連接點中,連接點是在方法被調用之前或之后秕铛。

@AfterReturning("myPointcut()")
public void myAfterReturningAdvice(JoinPoint joinPoint) {
    // 在方法成功返回后執(zhí)行代碼约郁,并傳遞JoinPoint參數(shù)
}

上面的代碼定義了一個@AfterReturning通知耘柱,它在myPointcut切點匹配時執(zhí)行myAfterReturningAdvice方法,并傳遞JoinPoint參數(shù)棍现,該參數(shù)包含有關連接點的信息。

  1. 切面優(yōu)先級

如果有多個切面匹配同一個連接點镜遣,AspectJ將按照以下順序執(zhí)行它們的通知:

  • @Around
  • @Before
  • 按照聲明順序執(zhí)行所有其他類型的通知
  • @AfterReturning和@AfterThrowing

可以使用@Order注釋指定切面的優(yōu)先級己肮。

@Aspect
@Order(1)
public class MyAspect1 {
    // 切點和通知
}

@Aspect
@Order(2)
public class MyAspect2 {
    // 切點和通知
}

上面的代碼定義了兩個切面類,MyAspect1優(yōu)先于MyAspect2悲关。

  1. 切點函數(shù)

切點函數(shù)可以將切點表達式提取到單獨的函數(shù)中谎僻,以便在多個通知和切面中重復使用。

@Pointcut("execution(* com.example.MyClass.myMethod(..))")
public void myPointcut() {}

@Pointcut("within(com.example.MyClass)")
public void myWithinPointcut() {}

@Pointcut("myPointcut() && myWithinPointcut()")
public void myCombinedPointcut() {}

上面的代碼定義了三個切點函數(shù)寓辱,myPointcut匹配com.example.MyClass類的myMethod方法艘绍,myWithinPointcut匹配com.example.MyClass類中的所有方法,myCombinedPointcut同時匹配myPointcut和myWithinPointcut秫筏。

  1. 切點指示符

除了使用execution指示符定義切點外诱鞠,AspectJ還支持其他指示符,例如call这敬、get航夺、set、handler崔涂、preinitialization等阳掐。

@Pointcut("call(* com.example.MyClass.myMethod(..))")
public void myCallPointcut() {}

@Pointcut("get(* com.example.MyClass.myField)")
public void myGetPointcut() {}

上面的代碼定義了兩個切點,myCallPointcut匹配對com.example.MyClass.myMethod方法的調用冷蚂,myGetPointcut匹配對com.example.MyClass.myField字段的get訪問缭保。

  1. 參數(shù)綁定

通知可以使用參數(shù)綁定訪問連接點和切點。

@Before("myPointcut() &&args(param1, param2)")
public void myBeforeAdvice(JoinPoint joinPoint, Object param1, int param2) {
    // 在切點匹配時執(zhí)行代碼蝙茶,并傳遞JoinPoint參數(shù)和參數(shù)綁定值
}

上面的代碼定義了一個@Before通知艺骂,它在myPointcut切點匹配時執(zhí)行myBeforeAdvice方法,并傳遞JoinPoint參數(shù)和參數(shù)綁定值param1和param2隆夯。

  1. 引入

引入允許向現(xiàn)有類添加新功能或接口彻亲。

public interface MyInterface {
    void myMethod();
}

@Aspect
public class MyAspect {
    @DeclareParents(value = "com.example.MyClass", defaultImpl = MyInterfaceImpl.class)
    private MyInterface myInterface;
}

public class MyClass {
    // ...
}

public class MyInterfaceImpl implements MyInterface {
    public void myMethod() {
        // 添加新功能或接口
    }
}

上面的代碼使用@DeclareParents注釋將MyInterface添加到com.example.MyClass類中,并指定默認實現(xiàn)類MyInterfaceImpl吮廉。

  1. 注入

注入允許在運行時修改現(xiàn)有類的行為苞尝。

@Aspect
public class MyAspect {
    @Around("execution(* com.example.MyClass.myMethod(..))")
    public Object myAroundAdvice(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        // 在方法執(zhí)行前和執(zhí)行后執(zhí)行代碼
        Object result = proceedingJoinPoint.proceed();
        // 修改返回值或拋出異常
        return result;
    }
}

上面的代碼使用@Around注釋定義一個環(huán)繞通知,它在com.example.MyClass.myMethod方法執(zhí)行前和執(zhí)行后執(zhí)行代碼宦芦,并可以修改返回值或拋出異常宙址。

以上是AspectJ的基本語法和意義,它可以幫助開發(fā)人員在Java代碼中實現(xiàn)切面編程调卑。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末抡砂,一起剝皮案震驚了整個濱河市大咱,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌注益,老刑警劉巖碴巾,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異丑搔,居然都是意外死亡厦瓢,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進店門啤月,熙熙樓的掌柜王于貴愁眉苦臉地迎上來煮仇,“玉大人,你說我怎么就攤上這事谎仲≌愕妫” “怎么了?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵郑诺,是天一觀的道長夹姥。 經常有香客問我,道長辙诞,這世上最難降的妖魔是什么佃声? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮倘要,結果婚禮上圾亏,老公的妹妹穿的比我還像新娘。我一直安慰自己封拧,他們只是感情好志鹃,可當我...
    茶點故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著泽西,像睡著了一般曹铃。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上捧杉,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天陕见,我揣著相機與錄音,去河邊找鬼味抖。 笑死评甜,一個胖子當著我的面吹牛,可吹牛的內容都是我干的仔涩。 我是一名探鬼主播忍坷,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了佩研?” 一聲冷哼從身側響起柑肴,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎旬薯,沒想到半個月后晰骑,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡绊序,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年硕舆,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片政模。...
    茶點故事閱讀 38,163評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖蚂会,靈堂內的尸體忽然破棺而出淋样,到底是詐尸還是另有隱情,我是刑警寧澤胁住,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布趁猴,位于F島的核電站,受9級特大地震影響彪见,放射性物質發(fā)生泄漏儡司。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一余指、第九天 我趴在偏房一處隱蔽的房頂上張望捕犬。 院中可真熱鬧,春花似錦酵镜、人聲如沸碉碉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽垢粮。三九已至,卻和暖如春靠粪,著一層夾襖步出監(jiān)牢的瞬間蜡吧,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工占键, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留昔善,地道東北人。 一個月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓畔乙,卻偏偏與公主長得像耀鸦,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,925評論 2 344

推薦閱讀更多精彩內容