content: package com.ctrip.framework.apollo.common.aop;
  
  import com.ctrip.framework.apollo.tracer.Tracer;
  import com.ctrip.framework.apollo.tracer.spi.Transaction;
  
  import org.aspectj.lang.ProceedingJoinPoint;
  import org.aspectj.lang.annotation.Around;
  import org.aspectj.lang.annotation.Aspect;
  import org.aspectj.lang.annotation.Pointcut;
  import org.springframework.stereotype.Component;
  
  @Aspect
  @Component
  public class RepositoryAspect {
  
    @Pointcut("execution(public * org.springframework.data.repository.Repository+.*(..))")
    public void anyRepositoryMethod() {
    }
  
    @Around("anyRepositoryMethod()")
    public Object invokeWithCatTransaction(ProceedingJoinPoint joinPoint) throws Throwable {
      String name =
          joinPoint.getSignature().getDeclaringType().getSimpleName() + "." + joinPoint.getSignature()
              .getName();
      Transaction catTransaction = Tracer.newTransaction("SQL", name);
      try {
        Object result = joinPoint.proceed();
        catTransaction.setStatus(Transaction.SUCCESS);
        return result;
      } catch (Throwable ex) {
        catTransaction.setStatus(ex);
        throw ex;
      } finally {
        catTransaction.complete();
      }
    }
  }
  