1、添加Aspect相关依赖:
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
<scope>test</scope>
</dependency>
2、添加切面类:
本来中共有四个注解需要注意:
1、@Around("xxx()")
解释:环绕通知,在调用目标方法之前会执行,在调用目标方法之后仍执行。
注意:可以改变目标执行方法的返回值。
2、@Before("xxx()")
解释:在目标方法执行前执行。
注意:在该方法中处理实参,不会影响调用目标执行方法的返回值。
3、 @AfterReturning(pointcut="execution(切入点表达式)", returning="返回值(自定义和方法中的Object一致即可)")
解释:含有返回值的后置通知,可以拿到目标方法执行的返回结果。
注意:不会改变目标执行的返回结果。
4、 @After("xxxx()")
解释:后置通知,一般用来释放资源的!
package com.dk.aspectConfig;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.*;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;
import java.util.Arrays;
@Aspect
@Component
public class AdviceTest {
@Pointcut("execution(* com.dk.controller.*..*(..))")
public void pointCut(){}
@Around("pointCut()")
public Object process(ProceedingJoinPoint joinPoint) throws Throwable {
System.out.println("@Around:执行目标方法之前...");
Signature signature = joinPoint.getSignature();
String methodName = joinPoint.getTarget().getClass().getName()+"."+signature.getName()+"()";
String[] argNames = ((MethodSignature)signature).getParameterNames();
Object[] argsValues = joinPoint.getArgs();
String arg0 = "";
if (argsValues != null && argsValues.length > 0 && argsValues[0].getClass() == String.class) {
arg0 = (String) argsValues[0];
argsValues[0] = "修改值: 测试--入参第一个参数的类型为String";
}
Object returnValue = joinPoint.proceed(argsValues);
return "原来是String值:"+arg0+",修改后的String值:"+returnValue ;
}
@Before("pointCut()")
public void permissionCheck(JoinPoint joinPoint) {
String methodNameOne = joinPoint.getTarget().getClass().getName()+"."+joinPoint.getSignature().getName()+ "()";
String methodNameTwo = joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName();
Object[] args = joinPoint.getArgs();
String argumentsValue = Arrays.toString(joinPoint.getArgs());
}
@AfterReturning(pointcut="execution(* com.dk.controller.*..*(..))", returning="returnValue")
public void log(JoinPoint joinPoint, Object returnValue) {
String methodNameOne = joinPoint.getTarget().getClass().getName()+"."+joinPoint.getSignature().getName()+ "()";
String methodNameTwo = joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName();
String argumentsValue = Arrays.toString(joinPoint.getArgs());
System.out.println(returnValue);
}
@After("pointCut()")
public void releaseResource(JoinPoint point) {
System.out.println("@After:模拟释放资源...");
System.out.println("@After:目标方法为:" +
point.getSignature().getDeclaringTypeName() +
"." + point.getSignature().getName());
System.out.println("@After:参数为:" + Arrays.toString(point.getArgs()));
System.out.println("@After:被织入的目标对象为:" + point.getTarget());
}
}