首页 > 其他分享 >AOP-@Around环绕增强-理解问题-测试-记录

AOP-@Around环绕增强-理解问题-测试-记录

时间:2023-12-01 15:13:48浏览次数:30  
标签:Around AOP 注解 环绕 方法 proceed

来源

自定义注解测试切面环绕时,接口测试返回空白。

理解

关键在于:环绕增强后走的是切面类中的方法,你不给返回值(习惯void)就是空白=-=。

@Around

它可以包围一个方法或函数的执行,并在执行前后提供额外的逻辑
使用@Around注解,你可以定义一个通知(advice),该通知在目标方法执行之前和之后运行。这种通知可以用于日志记录、性能监控、安全检查、事务管理等场景。(自定义实现业务逻辑)

ProceedingJoinPoint类

ProceedingJoinPoint是Spring AOP中的一个重要类,用于表示一个切点(pointcut)的执行上下文。它封装了目标方法的调用,并提供了一种方式来执行目标方法并获取其返回值。

ProceedingJoinPoint的主要方法是proceed(),该方法会执行目标方法并返回其结果。(解析响应码、报错信息存日志等等)
其它方法:

  • getSignature():返回目标方法的签名(Signature)对象,可以用于获取方法名称、参数类型等信息。
  • getThis():返回目标对象(即被代理的对象),如果该对象为null,则返回代理对象。
  • getArgs():返回目标方法的参数列表。(解决不同类型入参对象的字段获取->可定义转换接口,入参泛化,注解反射带Class。)

解决

如代码。

/**
 * 切面类
 */
@Component
@Aspect
public class csAspct {
    @Pointcut("@annotation(com.xyz66.AOP.annotation.cs)")
    public void pointcut() {
    }
    
    @Around("pointcut()")
    public Object before(ProceedingJoinPoint joinPoint) throws Throwable {
        System.out.println("------Around环绕前--------");
        Signature signature = joinPoint.getSignature();// 得到签名
        MethodSignature methodSignature = (MethodSignature) signature;// 强转为方法签名
        Method method = methodSignature.getMethod();// 得到方法
        cs annotation = method.getAnnotation(cs.class);// 得到注解
        System.out.println("注解的value为:"+annotation.value());// 输出注解的值
        // 关键点!!!
        Object proceed = joinPoint.proceed();// 执行目标方法并返回其结果
        System.out.println(JSON.toJSONString(proceed));
        System.out.println("------Around环绕后--------");
        return proceed;
    }
}

记录

AOP切面的步骤:

  1. 定义切入点
  2. 横切逻辑
  3. 织入

实习记录:
记录日志,不想影响程序主链路性能,采用异步,搞一个线程池去跑(阻塞队列)。

    private ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(
            1,1,1, TimeUnit.SECONDS,new LinkedBlockingQueue<Runnable>(1000)
    );// 异步去跑

设计字段存在二种方式

  1. 先写代码实体类再设计表
  2. 先设计表再写实体类(也是后端玩)
    谁开发,谁设计;
    谁设计,谁背锅;
    谁背锅,谁修复;
    谁修复,谁开发。

解决不同类型入参对象的字段获取:
少就别定义接口,直接判断(instanceof)->强转。

/**  
 * 不同参数类型处理  
 * @param aName  
 * @param args  
 * @return String 参数对象字段-名称  
 */  
private static String assessmentType(String aName, Object[] args) {  
    for (Object arg : args) {  
        // 不同参数类型处理  
        if (arg instanceof XXXDTO){  
            // 强转
            XXXDTO cXXXDTO = (XXXDTO) arg;  
            aName = cXXXDTO.getXXXXName();  
        }  
        else if(arg instanceof AppraiseObjectDTO){  
            // 继续判断转
        }  
    }  
    return aName;  
}

service层业务不一定强迫症保证单一职责原则,要的可以组合成一个service提高效率。

标签:Around,AOP,注解,环绕,方法,proceed
From: https://www.cnblogs.com/gjkt2001/p/17869730.html

相关文章

  • AOP切面编程实现异常捕获——try-catch的更优解?
    AOP(面向切面编程)是一种编程范式,它的目的是通过将横切关注点(如日志记录、事务管理、异常处理等)从主要业务逻辑中分离出来,以提高代码的模块化和可维护性。在异常处理方面,有人认为使用AOP来实现异常捕获能够提供更优雅的解决方案,相比于传统的try-catch块。以下是一些可能的优势和注......
  • Spring_202311_21_2 2. AOP面向切面编程
    Spring_202311_21_22. AOP面向切面编程AOP:全称是AspectOrientedProgramming即:面向切面编程。简单的说它就是把我们程序重复的代码抽取出来,在需要执行的时候,使用动态代理的技术,在不修改源码的基础上,对我们的已有方法进行增强。即当需要扩展功能时,传统方式采用纵向继承方式......
  • Spring Boot 自定义注解,AOP 切面统一打印出入参请求日志
    今天主要说说如何通过自定义注解的方式,在SpringBoot中来实现AOP切面统一打印出入参日志。小伙伴们可以收藏一波。废话不多说,进入正题!一、先看看切面日志输出效果在看看实现方法之前,我们先看下切面日志输出效果咋样:从上图中可以看到,每个对于每个请求,开始与结束一目了然,并且打印......
  • AOP打印日志参数和耗时
    使用场景:可以通过AOP,以控制层controller所在的包为切点,在controller的方法前后打印日志,这样就能统计出接口的耗时,还能打印入参,出参,减少重复地打印日志。如果想统计dao层的入参和耗时,也可以用类似的方法。代码示例:@Aspect@ComponentpublicclassRequestLogAop{......
  • .NET 过滤器、中间件、AOP、拦截器及其应用
    一、过滤器(Filter)    一共5种、 AuthorizationFilter,ResourceFilter,ExceptionFilter,ActionFilter,ResultFilter    1.1、ExceptionFilter        新增全局异常过滤器GlobalExceptionFilter.cs。        当出现异常时进......
  • 常见面试题-Spring的aop和ioc如何实现?
    Spring的aop和ioc怎么实现?Spring的IOC是如何实现的呢?Spring的IOC是通过工厂+反射去实现的,在IOC中,Spring会将创建的Bean都放在工厂中,我们可以通过@Configuration来定义配置类,在配置类中通过@Bean来将Bean创建在Bean工厂中,在对Bean进行实例化时,使用的......
  • AOP以注解为切入点,获取注解参数和切点方法参数名
    AOP以注解为切入点,获取注解参数和切点方法参数名importcn.lettin.base.response.ResponseObjBaseVo;importcn.lettin.base.response.ResponseVo;importcn.lettin.keeper.edge.utils.UserNodeAuthCheckUtils;importorg.aspectj.lang.ProceedingJoinPoint;importorg.asp......
  • SpringBoot AOP + Redis 延时双删功能实战
    一、业务场景在多线程并发情况下,假设有两个数据库修改请求,为保证数据库与redis的数据一致性,修改请求的实现中需要修改数据库后,级联修改Redis中的数据。请求一:A修改数据库数据B修改Redis数据请求二:C修改数据库数据D修改Redis数据并发情况下就会存在A—>C—>D—>B的情......
  • .Net Core AOP之AuthorizeAttribute
    一、简介在.netcore中Filter分为以下六大类:1、AuthorizeAttribute(权限验证)2、IResourceFilter(资源缓存)3、IActionFilter(执行方法前后的记录)4、IResultFilter(结果生成前后扩展)5、IAlwaysRun(响应结果的补充)6、IExceptionFilter(异常处理)二、AuthorizeAttribute(权限验证)......
  • Spring概述,IOC,AOP使用
    Spring简介Spring概述官网地址:https://spring.io/Spring是最受欢迎的企业级Java应用程序开发框架,数以百万的来自世界各地的开发人员使用Spring框架来创建性能好、易于测试、可重用的代码。Spring框架是一个开源的Java平台,它最初是由RodJohnson编写的,并且于2003年6月......