springbootAOP基础,定义切点方式,获取/修改请求参数

本文详细介绍了AOP(面向切面编程)的六种通知类型,包括环绕通知、前置通知、后置返回通知、后置通知、异常通知和引入通知。此外,展示了如何使用AspectJ注解如@Aspect、@Pointcut和各种通知方法进行切面编程实践,以及定义切入点的不同方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.AOP介绍

1.六种通知方式

  • 环绕通知:在目标方法执行前和执行后实施增强,可用于日志记录,事务处理等
  • 前置通知:在目标方法执行前实施增强,可用于权限管控等
  • 后置返回通知:在目标方法成功执行后实施增强,可用于关闭流,删除临时文件等
  • 后置通知:在目标方法执行后实施增强(无论方法是否发生异常都执行),可用于释放资源
  • 异常通知:在目标方法抛出异常时实施增强,可用于处理异常,记录日志等
  • 引入通知:在目标类中添加一些方法和属性,用于修改目标类

2.AspectJ相关注解

  • @Aspect:用于定义一个切面,注解在切面类上
  • @Pointcut:用于定义切点表达式,在使用时,需要定义一个切入点方法,该方法返回值为void,且方法体为空的普通方法
  • @Before:用于定义前置通知,通常为其指定value属性,该值可以是已有切入点,也可以定义切点表达式
  • @AfterReturning:用于定义后置返回通知,通常为其指定value属性,该值可以是已有切入点,也可以定义切点表达式
  • @Around:用于定义环绕通知,通常为其指定value属性,该值可以是已有切入点,也可以定义切点表达式
  • AfterThrowing:用于定义异常通知,通常为其指定value属性,该值可以是已有切入点,也可以定义切点表达式。另外还有一个 throwing属性用于访问目标方法抛出的异常,该属性值与异常通知方法中同名的形参一致
  • After:用于定义后置最终通知,通常为其指定value属性,该值可以是已有切入点,也可以定义切点表达式

2.定义切入点的两种方式

1.注解

//定义注解
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface SafetyHarness {
    String defaultValue() default "";
}
//切入点
@Pointcut("@annotation(com.xx.xx.xx.web.annotation.SafetyHarness)")
    public void efficacyParameters(){
    }

2.表达式

//该controller所有方法,可以直接指定
/*
execution():表达式主体
第一个 * 表示返回类型,使用*表示所有类型,该 * 与包名之间有一个空格
第二个 * 表示类名
第三个 * 表示方法名
..表示任意参数
*/
@Pointcut("value = "execution(* com.xx.xx.xx.web.controller.*.* (..)))")
    public void efficacyParameters(){
    }

3.常用两种通知获取参数

1.@Before

@Before("efficacyParameters()")
    public void beforeEfficacyParameters(JoinPoint joinPoint){
            //获取请求参数
            ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
            HttpServletRequest request = Objects.requireNonNull(attributes).getRequest();
            Map<String, String[]> parameterMap = request.getParameterMap();
        	//通过参数名获取
            Object ext1 = parameterMap.get("ext1");
            Object ext2 = parameterMap.get("ext2");
    }

2.@Around

	@Around("efficacyParameters()")
    public T beforeEfficacyParameters(ProceedingJoinPoint joinPoint){
        	//接口返回结果,该结果可在业务前或业务后执行
            Object proceed = joinPoint.proceed();
   			
            Object[] obj = joinPoint.getArgs();
            if (obj == null || obj.length == 0) {
                return T;
            }
           //获取请求参数 
            Map<String, Object> fieldsName = getFieldsName(joinPoint);
            Object ext1 = fieldsName.get("ext1");
            //POST请求强转
            SafetyAuditPageVo ext2 = (SafetyAuditPageVo) fieldsName.get("ext");

			//修改请求参数
			SafetyAuditPageVo vo = (SafetyAuditPageVo) obj[0];
                vo.setXxxx("XXXXXX");
                obj[0] = vo;
                return  joinPoint.proceed(obj);
    }

	private static Map<String, Object> getFieldsName(ProceedingJoinPoint joinPoint) {
      
        Object[] args = joinPoint.getArgs();
        ParameterNameDiscoverer pnd = new DefaultParameterNameDiscoverer();
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
        Method method = signature.getMethod();
        String[] parameterNames = pnd.getParameterNames(method);
        Map<String, Object> paramMap = new HashMap<>(32);
        for (int i = 0; i < parameterNames.length; i++) {
            paramMap.put(parameterNames[i], args[i]);
        }
        return paramMap;
    }
AOP(面向切面编程)是一种编程范式,它通过在程序运行过程中的特定位置(切点)将额外的功能(加强方法)添加到应用程序中。 切点是程序执行过程中的一个特定位置。在AOP中,我们可以通过定义切点来确定在何处插入额外的功能。切点可以是方法的执行、异常的抛出、字段的访问等。通过使用切点,我们可以精确定位到在应用程序执行期间需要被增强的位置。 获取加强方法参数是指在切面中获取到被增强的方法的参数。在AOP中,我们可以通过在切面中定义一个参数列表来获取被增强方法的参数。这样我们就可以在程序执行时获取到这些参数,并进行相应的操作。 例如,假设我们有一个切点是程序中的一个方法,而这个方法有一个参数name。我们可以在切面中定义一个参数列表,将这个name参数作为切面的参数之一。然后在执行程序时,我们可以通过访问切面的参数列表获取到这个name参数的值。 通过获取加强方法参数,我们可以在AOP中实现一些有用的功能,比如记录日志、进行权限控制、性能监控等。通过在切面中获取方法参数,我们可以根据具体的需求来对这些参数进行处理,从而达到对应的功能目的。 总之,AOP切点获取加强方法参数是指在AOP编程中,通过定义切点来精确定位到需要被增强的位置,并通过切面中定义参数列表获取到被增强方法的参数,以实现对参数的操作和处理。这样能够给应用程序增加额外的功能,并提高程序的灵活性和可维护性。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值