SpringBoot快速上手異常集中處理&AOP切面程式設計&(自用)
阿新 • • 發佈:2022-06-01
SpringBoot——錯誤集中處理
簡介:簡化複雜的判斷,通過丟擲異常集中處理。降低耦合性
基礎操作
-
建立錯誤
-
捕獲錯誤
@RestControllerAdvice public class ExceptionConfig { //捕獲對應錯誤 @ExceptionHandler(TryException.class) public void tryException(TryException exception){ //對錯誤進行相應的處理 System.out.println(exception.getMessage()); } }
特點:
- 可以注入
- 捕獲父類就可以捕獲子類
SpringBoot——AOP切面
簡介:對於請求有攔截器,對於方法有AOP。AOP切面程式設計,遊離於主邏輯的操作,通過對方法的侵入做到對方法的執行前後、錯誤、整個執行流程進行增強、修改操作。
專有名詞:
- Aspect:切面,專門定義AOP的一個類。【給一個範圍建立城牆】
- Pointcut:切入點。【看守大門的士兵】
- weave:織入。【安排看守大門的士兵去大門看守】
- JointPoint:連線點。【被攔在大門的行人】
- Advice:通知,對切入點進行增強處理【對攔截的人進行一些檢查處理】
- Before:前置增強
- After:後置增強
- AfterReturning:後置增強,帶返回引數,遇到錯誤不執行
- AfterThrowing:後置異常增強
- Around:前後置增強
- 等
基礎操作
-
匯入對應依賴
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency>
-
建立切面
@Aspect @Configuration public class AOPConfig { //切入點 @Pointcut("execution(* com.musir.problem.webLearn.controller.*.*(..))") public void pointCut(){} //前置 @Before("pointCut()") public void before(JoinPoint joinPoint){} //正常後置 @AfterReturning(value = "pointCut()",returning = "result") public void after(JoinPoint joinPoint,Object result){ } //錯誤後置 @AfterThrowing(value = "pointCut()",throwing = "exception") public void error(JoinPoint joinPoint,NullPointerException exception){} //後置 @After("pointCut()") public void end(JoinPoint joinPoint){} }
-
execution:匹配公式
- 作用:對方法進行匹配
- 格式:execution(返回型別 返回引數 包.方法(引數..))
- 返回型別和返回引數可以用 * 表示匹配任何型別
- 引數通過 .. 表示長度與型別任意
-
@Aspect:定義一個切面
-
@Pointcut:定義一個切入點
- 引數:匹配公式
-
@Before:前置增強
- 引數:匹配公式或切入點
-
@AfterReturning:正常後置
- 引數:
- value:匹配公式或切入點【必須在第一個】
- returning:綁定當前方法引數名稱【當前AOP增強方法的返回值名稱】
- 引數:
-
@AfterThrowing:錯誤後置
- 引數:
- value:匹配公式或切入點【必須在第一個】
- throwing:綁定當前錯誤引數名稱【當前AOP增強方法的返回值名稱】
- 引數:
-
@After:後置
- 引數:匹配公式或切入點
-
JoinPoint:連線電
-
常用方法:
joinPoint.getArgs(): 獲取請求引數即陣列 joinPoint.getSignature(): tostring(): 獲取引數完整資訊,如 string com.XX(String) getName(): 獲取方法名 getDeclaringTypeName(): 獲取完整的方法路徑
-
-
特點:
- 可以通過@Autowired注入,然後進行操作
- 操作時丟擲錯誤依然會被集中處理
- 攔截的地方為獲取引數之後,所以通過@RequestParm賦預設值是可以注入的
高階操作
通過註解執行
@Pointcut(value = "@annotation(com.hanna.common.lang.TokenAop)")
public void pointCut(){}
//獲取註解引數
@Before("pointCut && @annotation(abc)" , returning = "result")
public void test(TokenAop abc,Object result){}//注意註解的annotation括號內參數與方法的引數名稱相同