Spring中切面方法的`Aspect`的使用

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;

/**
 * @author Aspect切面统一处理类
 */
@Aspect
@Component
public class AdviceTest {

    /**
     * 定义其余点表达式定义类,可以基于当前类名,引用execution表达式子内容;
     */
    @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 ;
    }


    /**
     * 在目标方法执行前执行
     * @param joinPoint 连接点
     */
    @Before("pointCut()")
    public void permissionCheck(JoinPoint joinPoint) {
        //获取类及方法名:com.dk.controller.TestController.ping()
        String methodNameOne = joinPoint.getTarget().getClass().getName()+"."+joinPoint.getSignature().getName()+ "()";
        String methodNameTwo = joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName();
        //获取实参值:将args的值改变不影响调用结果:
        Object[] args = joinPoint.getArgs();
        String argumentsValue = Arrays.toString(joinPoint.getArgs());
    }


    /**
     * 目标方法执行后的处理方法:(在该方法中修改返回值,不影响目标方法的返回值)
     * @param joinPoint 连接点
     * @param returnValue 调用目标方法的返回值
     */
    @AfterReturning(pointcut="execution(* com.dk.controller.*..*(..))", returning="returnValue")
    public void log(JoinPoint joinPoint, Object returnValue) {
        //获取类及方法名:com.dk.controller.TestController.ping()
        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);
    }

    /**
     * 一般用来释放资源的
     * @param point 连接点
     */
    @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());
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值