Spring Boot使用注解實現AOP


第一步: 添加依賴

     <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>

第二步:定義切面類

package com.zdst.scs.web.controller.interact.aop;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;
import org.springframework.ui.Model;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

/**
 * 這個切面類的功能是給方法的Model添加參數
* 切點表達式匹配的是兩個, 如果只有一個可以去掉 || 及后面的表達式,匹配條件變成一個
*/ @Aspect @Component public class  aop {
  //切點表達式意義自行百度 注意,指定到方法和指定類下所有方法 這兩種情況的表達式不同
  //指定到方法: public * com.web.controller.UserController.aop*(..)) UserController類中以aop開頭的方法
// 指定到類: public * com.web.controller.UserController.*.*(..)) UserController類中的所有方法
@Pointcut(
"execution(public * com.web.controller.UserController.aop*(..)) || " + "execution(public * com.web.controller.AnotherController.aop*(..))") public void token(){} /** * 添加token */ @Before("token()") public void doBefore(JoinPoint joinPoint){ ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); HttpServletRequest request = attributes.getRequest();//獲取request請求 HttpSession session = (HttpSession)request.getSession();//獲取session String token=(String)session.getAttribute("token");//獲取session存儲的屬性值 Object[] obj = joinPoint.getArgs();//獲取目標方法參數信息 for (Object argItem : obj) { if (argItem instanceof Model) { Model model = (Model) argItem; model.addAttribute("token",token);//設置參數內容 } } } //目標方法執行完后執行 @After("token()") public void doAfter(){ ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); HttpServletRequest request = attributes.getRequest(); System.out.println(request.getAttributeNames()); }   //獲取目標方法返回數據后執行 @AfterReturning(returning = "object",pointcut = "token()") public void doAfterReturn(Object object){ System.out.println(object.toString()); } }

當調用到切點表達式中的需要被增強的方法時, 就會先進入doBefore方法進行增強

定義切入點表達式    execution(* com.sample.service.impl..*.*(..))
其語法如下所示:
整個表達式可以分為五個部分:
(1)、execution(): 表達式主體。
(2)、第一個*號:表示返回類型,*號表示所有的類型。
(3)、包名:表示需要攔截的包名,后面的兩個句點表示當前包和當前包的所有子包,com.sample.service.impl包、子孫包下所有類的方法。
(4)、第二個*號:表示類名,*號表示所有的類。
(5)、*(..):最后這個星號表示方法名,*號表示所有的方法,后面括弧里面表示方法的參數,兩個句點表示任何參數。

想了解更多請自行百度切點表達式


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM