栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

1、添加Aspect相关依赖:
        
            org.aspectj
            aspectjweaver
        
        
            org.springframework.boot
            spring-boot-starter-aop
            test
        
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) {
        //获取类及方法名: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());
    }


    
    @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);
    }

    
    @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());
    }
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/680800.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号