06-SpringBoot之WEB(四)—— 配置AOP切面
阿新 • • 發佈:2018-11-17
SpringBoot之WEB(四)
1. 新增AOP依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
2. 編寫切面類
import org.aspectj.lang. JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet. http.HttpServletRequest;
import java.util.Arrays;
/**
* Created by HuangJun
* 11:24 2018/11/9
*/
@Aspect
@Component
public class MyAspect {
@Pointcut("execution(public * com.springboot.web.controller..*.*(..))")
public void myAspect() {
}
/***
* 前置通知
* @param joinPoint
* @throws Throwable
*/
@Before("myAspect()")
public void doBefore(JoinPoint joinPoint) throws Throwable {
System.out.println( "===============前置通知 Start===================");
// 接收到請求,記錄請求內容
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
// 記錄下請求內容
System.out.println("URL : " + request.getRequestURL().toString());
System.out.println("HTTP_METHOD : " + request.getMethod());
System.out.println("IP : " + request.getRemoteAddr());
System.out.println("CLASS_METHOD : " + joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName());
System.out.println("ARGS : " + Arrays.toString(joinPoint.getArgs()));
System.out.println( "===============前置通知 End===================");
}
/***
* 後置通知
*/
@After("myAspect()")
public void doAfter(JoinPoint joinPoint){
System.out.println( "===============後置通知 Start===================");
System.out.println( "===============後置通知 End===================");
}
/***
* 環繞通知
*/
@Around("myAspect()")
public void doAround(ProceedingJoinPoint jointPoint){
try {
System.out.println( "===============環繞通知 Start===================");
String name = (String) jointPoint.proceed();
jointPoint.proceed();
System.out.println( "name=" + name);
System.out.println( "===============環繞通知 End===================");
} catch (Throwable e) {
e.printStackTrace();
}
}
/***
* 返回通知
*/
@AfterReturning("myAspect()")
public void doAfterReturning(JoinPoint joinPoint) {
System.out.println( "===============返回通知 Start===================");
System.out.println( "===============返回通知 End===================");
}
/***
* 異常通知
*/
@AfterThrowing("myAspect()")
public void doAfterThrowing(JoinPoint joinPoint){
System.out.println( "===============異常通知 Start===================");
System.out.println( "===============異常通知 End===================");
}
}
3. 執行結果
瀏覽器訪問http://localhost:8080/test/freemarker,控制檯列印輸出結果
這是實際執行結果,但仔細觀察這並不是我們期望的結果,這是因為環繞通知。環繞通知功能強大,但不好把握,我們先暫時把環繞通知註釋掉,再執行檢視結果:
這是我們期望的結果。
4. 原始碼下載
原始碼下載地址:https://download.csdn.net/download/huangjun0210/10774611