如何通过注释转换/实现spring aop函数

时间:2017-06-24 09:01:17

标签: spring-boot spring-aop spring-annotations

我想在调用某些服务方法时记录花在日志文件上的时间,现在我按AOP实现它,例如

@Around("execution(* sample..TaskService.*(..))")
public Object aroundStat(ProceedingJoinPoint joinPoint) throws Throwable {
    long start = System.currentTimeMillis();

    Object proceed = joinPoint.proceed();

    long end = System.currentTimeMillis();
    String methodName = joinPoint.getSignature().getName();
    log.info("{} taken time: {} ms",methodName,(end-start));
    return proceed;
}

但我想知道如何使用注释来实现它,就像@Trasactional一样,例如。

@Service
@TimeLogging
public class TaskService {
    @TimeLogging
    List<TaskStatDTO> taskStatusStat(String name){
        //...
    }

    List<TaskStatDTO> finishedTaskStat(String name){
        //...
    }
    //...
}

我可以实现一些类并重写一些方法吗?

1 个答案:

答案 0 :(得分:0)

  1. 不要使用系统时间执行测量时间,请使用spring或apache中的StopWatch。请参阅good example - Measure execution time in Java – Spring StopWatch Examplespring api StopWatch
  2. long start = System.currentTimeMillis();    
    long end = System.currentTimeMillis();    
    (end-start)
    

    更改为

    StopWatch watch = new StopWatch();
    watch.start();
    ..... execution
    watch.stop();
    watch.getTotalTimeMillis()
    
    1. 而不是

    2.   

      @Around(&#34;执行(* sample..TaskService。*(..))&#34;)

      使用

        

      @Around(&#34;执行(* sample..TaskService。(..)&amp;&amp; @annotation( sample ... TimeLogging)&#34;)

      请参阅Advice parameters

      更好:请参阅Combining pointcut expressionsSharing common pointcut definitions

      @Pointcut("execution(@annotation(* sample...TimeLogging)")
      private void withTimeExecutionLayer() {}
      
      @Pointcut("execution(public *sample..service.* *(..))")
      privatr void inServiceLayer() {}
      
      @Pointcut("inServiceLayer() && withTimeExecutionLayer()")
      private void auditTimeExecutionServiceLayer() {}