
 
@Slf4j
@Component
@Aspect//aop类
public class TimeAspect {
/*Around 环绕通知  用ProceedingJoinPoint
@Before 前置通知  用JoinPoint(是ProceedingJoinPoint的父类型),用它可以获得方法执行的相关信息,如目标类名,方法名,方法参数
@After 后置通知  用JoinPoint   ,jpinPoint.getTargrt(),getClass().getName();(获取目标类名)
@AfterReturning 返回后通知  用JoinPoint  ,jpinPoint.getSignstrue();(获取目标方法签名)
*@AfterThrowing 异常后通知  用JoinPoint    ,jpinPoint.getSignature().getName();(获取目标方法名)
                                         ,jpinPoint.getArgs();(获取目标方法运行参数)
 */
//@annotation切入点表达式,用于匹配有特点注解的方法
    //@annotation(com.itheima.aop.MyLog)仅仅匹配上面加有@MyLog注解的方法
    //execution切入点表达式,主要根据方法的返回值,包名,类名,方法名,方法参数等信息来匹配
// 例如:execution(void com.itheima.service.impl.empserviceimpl.getById(java.lang.Integer));execution切入点表达式
  @Around("execution(* com.itheima.service.*.*(..))") //切入点表达式
    public Object recordTime(ProceedingJoinPoint joinPoint) throws Throwable {
        long begin=System.currentTimeMillis();
        Object result = joinPoint.proceed();//目标方法放行
        long end =System.currentTimeMillis();
log.info(joinPoint.getSignature()+"方法执行耗时:{}ms",end-begin);
        return result;
    }
}