Spring Boot框架-使用AOP處理請求
阿新 • • 發佈:2019-02-12
pom.xml中匯入
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
新建 Package:aspect 包內建類:HttpAspect
通過註釋:Aspect和Component來建立攔截類
@Aspect @Component public class HttpAspect { @Before("execution(public * com.imooc.Controller.GirlController.*(..))")//攔截GirlController類下所有的方法 ..代表任意引數 public void log(){ System.out.println("攔截到了!"); }
執行順序是先執行切面程式,再執行源程式
將切面整理為
@Aspect @Component public class HttpAspect { @Pointcut("execution(public * com.imooc.Controller.GirlController.girlList(..))") public void log(){}//定義一個共用方法,使用Pointcut註解 @Before("log()") public void doBefore(){ } @After("log()") public void doAfter(){ } }
拋棄prienln(),我們使用log日誌來記錄執行資訊
@Aspect
@Component
public class HttpAspect {
private final static Logger logger
= LoggerFactory.getLogger(HttpAspect.class);
···
···
public void doAfter(){
logger.info("22222");
}
}
我們要通過Before來獲取請求資訊了
public void doBefore(JoinPoint joinPoint){ ServletRequestAttributes attrubutes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); HttpServletRequest request = attrubutes.getRequest(); //url logger.info("url={}",request.getRequestURI()); //method logger.info("method={}",request.getMethod()); //ip logger.info("ip={}",request.getRemoteAddr()); //類方法 logger.info("class_method={}",joinPoint.getSignature().getDeclaringTypeName() + "."+joinPoint.getSignature().getName()); //引數 logger.info("args={}",joinPoint.getArgs()); }
那我們如何獲取返回給端的資訊呢
@AfterReturning(returning = "object",pointcut = "log()")//用來返回資訊
public void doAfterReturning(Object object){
logger.info("response={}",object.toString());
}
我們要在模板類裡新增一個toString()的方法,類似這樣
public String toString() {
return "Gril{" +
"id=" + id +
", cupSize='" + cupSize + '\'' +
", age=" + age +
'}';
}
才能返回object物件的資料