1. 程式人生 > >Spring攔截服務【三】(SpringBoot使用切片Aspect)【完結】

Spring攔截服務【三】(SpringBoot使用切片Aspect)【完結】

Spring最重要的有個知識點就是切面程式設計AOP

@Aspect註解將表示它是一個切面
@Component表示它是一個Spring的元件

切面有很多種寫法,可以在Spring的官網的11章點選檢視Spring官網官方文件 本文將用@Around進行切面。

package com.yhn.web.aspect;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;
/**
 * Created by yhn on 2017/12/3.
 */
@Aspect
@Component
public class TimeAspect {
     @Around("execution(* com.yhn.web.controller.UserController.*(..))")
    public Object handleControllerMethod(ProceedingJoinPoint pjp)throws Throwable{
         System.out.println("TimeAspect filter start");
         Object[] objs = pjp.getArgs();
         for(Object obj:objs){
             System.out.println("獲得引數:"+obj);
         }
         Object object = pjp.proceed();  //拿到方法返回值的物件
         System.out.println("獲得返回物件:"+object);
         System.out.println("TimeAspect filter end");
         return null;
     }
}

通過ProceedingJoinPoint物件的getArgs()我們可以得到傳進來的引數。
通過ProceedingJoinPoint物件的proceed()我們可以得到拿到切面方法返回值的物件。

既然是攔截服務的完結篇,我當然要簡單說下各自的區別和使用場景;

過濾器Filter可以拿到原始的HTTP請求和響應的資訊,但是拿不到你真正處理請求方法的資訊,也就是方法的資訊。
攔截器Interceptor可以拿到原始的HTTP請求和響應的資訊,也可以拿到你真正處理請求方法的資訊,但是拿不到傳進引數的那個值。

切片Aspect,既然Spring那麼支援AOP,就肯定都能拿。有人會問如何拿原始的HTTP請求和響應的資訊,通過以下程式碼應該拿得到啊哈哈哈哈

ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();