Spring攔截服務【三】(SpringBoot使用切片Aspect)【完結】
阿新 • • 發佈:2019-02-10
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();