AOP代碼實戰(zhàn)

AOP(面向劃面編程)是一種編程范式,旨在提高代碼的模塊化鬼佣。它允許開發(fā)者將橫切關(guān)注點(cross-cutting concerns),如日志記錄露懒、事務(wù)管理译暂、安全性等崎脉,從他們影響的業(yè)務(wù)邏輯中分離出來。在Java世界中掐暮,Spring框架是實現(xiàn)AOP最常見的工具之一。

以下是一個簡單的AOP示例殖妇,其中定義了一個切面(Aspect)來織入日志記錄的行為:


import org.aspectj.lang.annotation.Aspect;

import org.aspectj.lang.annotation.Before;

import org.aspectj.lang.annotation.Pointcut;

import org.aspectj.lang.JoinPoint;

import org.springframework.stereotype.Component;

@Aspect

@Component

public class LoggingAspect {

? ? // 定義一個切入點,匹配所有Service類的方法

? ? @Pointcut("within(com.example.service.*)")

? ? public void serviceMethods() {

? ? }

? ? // 在每個服務(wù)方法之前執(zhí)行

? ? @Before("serviceMethods()")

? ? public void logMethodAccessBefore(JoinPoint joinPoint) {

? ? ? ? String methodName = joinPoint.getSignature().getName();

? ? ? ? System.out.println("Before running loggingAdvice on method=" + methodName);

? ? }

? ? // 你可以添加更多的通知(Advice)蔓彩,例如After, AfterReturning, AfterThrowing, Around等

}


在上述代碼中,`@Aspect`注解標(biāo)記了`LoggingAspect`類作為一個切面锐锣。`@Pointcut`注解定義了一個名為`serviceMethods`的切點腌闯,它匹配位于`com.example.service`包下任意類的所有方法。`@Before`注解表明了`logMethodAccessBefore`方法應(yīng)該在匹配切點的方法之前執(zhí)行雕憔。這樣姿骏,每當(dāng)調(diào)用服務(wù)層的任何方法時,都會先執(zhí)行日志記錄的邏輯斤彼。

為了使這個切面生效分瘦,你需要確保Spring AOP的相關(guān)配置已經(jīng)設(shè)置好,并且在Spring容器中包含了`LoggingAspect`類琉苇。通常嘲玫,這可以通過組件掃描完成,只要`LoggingAspect`類所在的包在Spring的組件掃描路徑中即可并扇。



AOP(面向方面編程)錯誤處理時去团,假設(shè)在Java中使用Spring框架的AspectJ注解來創(chuàng)建一個切面,該切面攔截方法執(zhí)行并提供統(tǒng)一的異常處理。以下是一個簡單的例子土陪。

首先昼汗,定義一個自定義異常:


public class CustomException extends Exception {

? ? public CustomException(String message) {

? ? ? ? super(message);

? ? }

}


然后,創(chuàng)建一個示例服務(wù)鬼雀,其中有可能拋出異常的方法:


import org.springframework.stereotype.Service;

@Service

public class ExampleService {

? ? public void someMethod() throws CustomException {

? ? ? ? // 模擬業(yè)務(wù)邏輯

? ? ? ? if (Math.random() > 0.5) {

? ? ? ? ? ? throw new CustomException("隨機(jī)失敗");

? ? ? ? }

? ? }

}


接下來顷窒,定義一個Aspect用于捕獲`CustomException并進(jìn)行處理:



import org.aspectj.lang.annotation.Aspect;

import org.aspectj.lang.annotation.AfterThrowing;

import org.springframework.stereotype.Component;

@Aspect

@Component

public class ErrorHandlingAspect {

? ? @AfterThrowing(pointcut = "execution(* com.yourpackage.ExampleService.*(..))", throwing = "ex")

? ? public void handleCustomException(CustomException ex) {

? ? ? ? // 處理異常, 比如記錄日志或者執(zhí)行其他錯誤處理邏輯

? ? ? ? System.out.println("發(fā)生了自定義異常: " + ex.getMessage());

? ? }

}


確保啟動類上添加了@EnableAspectJAutoProxy注解,以便啟用AOP代理支持:



import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

import org.springframework.context.annotation.EnableAspectJAutoProxy;

@SpringBootApplication

@EnableAspectJAutoProxy

public class YourApplication {

? ? public static void main(String[] args) {

? ? ? ? SpringApplication.run(YourApplication.class, args);

? ? }

}


現(xiàn)在源哩,當(dāng)`ExampleService`的`someMethod`方法拋出`CustomException`時鞋吉,`ErrorHandlingAspect`的`handleCustomException`方法會被自動調(diào)用,并能處理這個異常励烦。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末谓着,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子崩侠,更是在濱河造成了極大的恐慌漆魔,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件却音,死亡現(xiàn)場離奇詭異改抡,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)系瓢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進(jìn)店門阿纤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人夷陋,你說我怎么就攤上這事欠拾。” “怎么了骗绕?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵藐窄,是天一觀的道長。 經(jīng)常有香客問我酬土,道長荆忍,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任撤缴,我火速辦了婚禮刹枉,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘屈呕。我一直安慰自己微宝,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布虎眨。 她就那樣靜靜地躺著蟋软,像睡著了一般镶摘。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上岳守,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天钉稍,我揣著相機(jī)與錄音,去河邊找鬼棺耍。 笑死,一個胖子當(dāng)著我的面吹牛种樱,可吹牛的內(nèi)容都是我干的蒙袍。 我是一名探鬼主播,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼嫩挤,長吁一口氣:“原來是場噩夢啊……” “哼害幅!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起岂昭,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤以现,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后约啊,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體邑遏,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年恰矩,在試婚紗的時候發(fā)現(xiàn)自己被綠了记盒。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡外傅,死狀恐怖纪吮,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情萎胰,我是刑警寧澤碾盟,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站技竟,受9級特大地震影響冰肴,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜灵奖,卻給世界環(huán)境...
    茶點故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一嚼沿、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧瓷患,春花似錦骡尽、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽箫踩。三九已至,卻和暖如春谭贪,著一層夾襖步出監(jiān)牢的瞬間境钟,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工俭识, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留慨削,地道東北人。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓套媚,卻偏偏與公主長得像缚态,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子堤瘤,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,724評論 2 354

推薦閱讀更多精彩內(nèi)容