1. 程式人生 > 其它 >SpringBoot快速上手異常集中處理&AOP切面程式設計&(自用)

SpringBoot快速上手異常集中處理&AOP切面程式設計&(自用)

SpringBoot——錯誤集中處理

簡介:簡化複雜的判斷,通過丟擲異常集中處理。降低耦合性


基礎操作

  1. 建立錯誤

  2. 捕獲錯誤

    @RestControllerAdvice
    public class ExceptionConfig {
    
        //捕獲對應錯誤
        @ExceptionHandler(TryException.class)
        public void tryException(TryException exception){
            //對錯誤進行相應的處理
            System.out.println(exception.getMessage());
        }
    
    }
    

特點

  1. 可以注入
  2. 捕獲父類就可以捕獲子類

SpringBoot——AOP切面

簡介:對於請求有攔截器,對於方法有AOP。AOP切面程式設計,遊離於主邏輯的操作,通過對方法的侵入做到對方法的執行前後、錯誤、整個執行流程進行增強、修改操作。

專有名詞

  • Aspect:切面,專門定義AOP的一個類。【給一個範圍建立城牆】
  • Pointcut:切入點。【看守大門的士兵】
  • weave:織入。【安排看守大門的士兵去大門看守】
  • JointPoint:連線點。【被攔在大門的行人】
  • Advice:通知,對切入點進行增強處理【對攔截的人進行一些檢查處理】
    • Before:前置增強
    • After:後置增強
    • AfterReturning:後置增強,帶返回引數,遇到錯誤不執行
    • AfterThrowing:後置異常增強
    • Around:前後置增強

基礎操作

  1. 匯入對應依賴

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-aop</artifactId>
    </dependency>
    
  2. 建立切面

    @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){}
    }
    
    1. execution:匹配公式

      • 作用:對方法進行匹配
      • 格式:execution(返回型別 返回引數 包.方法(引數..))
        • 返回型別和返回引數可以用 * 表示匹配任何型別
        • 引數通過 .. 表示長度與型別任意
    2. @Aspect:定義一個切面

    3. @Pointcut:定義一個切入點

      • 引數:匹配公式
    4. @Before:前置增強

      • 引數:匹配公式或切入點
    5. @AfterReturning:正常後置

      • 引數:
        • value:匹配公式或切入點【必須在第一個】
        • returning:綁定當前方法引數名稱【當前AOP增強方法的返回值名稱】
    6. @AfterThrowing:錯誤後置

      • 引數:
        • value:匹配公式或切入點【必須在第一個】
        • throwing:綁定當前錯誤引數名稱【當前AOP增強方法的返回值名稱】
    7. @After:後置

      • 引數:匹配公式或切入點
    8. JoinPoint:連線電

      • 常用方法:

        joinPoint.getArgs(): 獲取請求引數即陣列
        joinPoint.getSignature():
        	tostring(): 獲取引數完整資訊,如 string com.XX(String)
        	getName(): 獲取方法名
        	getDeclaringTypeName(): 獲取完整的方法路徑
        

特點:

  1. 可以通過@Autowired注入,然後進行操作
  2. 操作時丟擲錯誤依然會被集中處理
  3. 攔截的地方為獲取引數之後,所以通過@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括號內參數與方法的引數名稱相同