1. 程式人生 > >06-SpringBoot之WEB(四)—— 配置AOP切面

06-SpringBoot之WEB(四)—— 配置AOP切面

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