LyneDefense 2022-09-23 00:04 采纳率: 100%
浏览 103
已结题

利用Aspect注解无法进入子方法的切片

Java Aspect 记录程序运行时碰到的问题。具体见代码。
测试说明

在TestComponent中有task1和task2两个方法,都用了TaskMonitor注解。其中task1中调用了task2的方法,在controller测试勒中调用了task1方法。预期的结果是task1和task2都会记录运行时间,但是测试结果只记录了task1的运行时间。想请问这是为什么,也想知道如何修改才能同时输出task1和task2的运行时间。ps:将task1和task2放在不同的bean中,然后通过bean调用确实可以同时输出task1和task2的记录时间,但是我不想这么做。求其他解决方案。

img

具体代码

注解类

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface TaskMonitor {
  String taskName() default "";
}

Aspect类

@Aspect
@EnableAspectJAutoProxy(proxyTargetClass = true)
@Component
@Order(-1)
@Slf4j
public class TaskMonitorAspect {

  @Pointcut("execution(@com.TaskMonitor * *(..))")
  private void timeMonitor() {}

  @Around("timeMonitor()")
  public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
    StopWatch stopWatch = new StopWatch();
    stopWatch.start();
    try {
      MethodSignature signature = (MethodSignature) joinPoint.getSignature();
      Method method = signature.getMethod();
      TaskMonitor monitor = method.getAnnotation(TaskMonitor.class);
      String splitLine = "=========================";
      log.info(String.format("%s开始执行任务%s%s: ", splitLine, monitor.taskName(), splitLine));
      Object result = joinPoint.proceed(joinPoint.getArgs());
      stopWatch.stop();
      log.info(String.format("运行时间: %sms",stopWatch.getTotalTimeMillis()));
      log.info(String.format("%s%s任务执行结束%s: ", splitLine, monitor.taskName(), splitLine));
      return result;
    } catch (Throwable e) {
      throw e;
    }
  }
}

测试类

@Component
public class TestComponent {

  @Autowired TestComponent2 testComponent2;

  @TaskMonitor(taskName = "任务1")
  public void task1() {
    try {
      Thread.sleep(500);
      this.task2();
    } catch (InterruptedException e) {
      throw new RuntimeException(e);
    }
  }

    @TaskMonitor(taskName = "任务2")
    public void task2() {
        try {
            Thread.sleep(500);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
    }
}

@RestController
public class TestController {

    @Autowired TestComponent testComponent;

    @GetMapping("/test")
    public String test(){
        testComponent.task1();
        return "SUCCESS";
    }
}
  • 写回答

9条回答 默认 最新

  • 游一游走一走 2022-09-23 11:16
    关注
    1. 造成的原因

    img

    1. 比较简单解决的方案

    img

    1. 使用完整的aspectJ 方法
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(8条)

报告相同问题?

问题事件

  • 系统已结题 10月4日
  • 已采纳回答 9月26日
  • 创建了问题 9月23日

悬赏问题

  • ¥15 stata安慰剂检验作图但是真实值不出现在图上
  • ¥15 c程序不知道为什么得不到结果
  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题