第一步: 添加依賴
<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)、*(..):最后這個星號表示方法名,*號表示所有的方法,后面括弧里面表示方法的參數,兩個句點表示任何參數。
想了解更多請自行百度切點表達式