利用注解的方式编写 了一个计算方法执行时间的切面,我把注解放在了controller层的方法上和一个自定义的方法上,但是发现自定义方法没有执行这个切面。
第一个方法为一个controller,第二个方法为这个controller方法里边调用的另一个方法
最后的日志只打印了 第一个方法的执行时间,
注解
package com.bjidit.eccms.common.aop;
import java.lang.annotation.*;
/**
* @author Jgybz
* @date 2022/4/28/0028 15:54
* @des
*/
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface MethodRunTime {
}
切面
package com.bjidit.eccms.common.aop;
import com.bjidit.eccms.common.exception.BusinessException;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
/**
* @author Jgybz
* @date 2022/4/28/0028 15:56
* @des
*/
@Aspect
@Component
public class MethodRunTimeAspect {
private final Logger log = LoggerFactory.getLogger(this.getClass());
/**
* 切点 扫描整个mapper
*/
@Pointcut("@annotation(com.bjidit.eccms.common.aop.MethodRunTime)")
public void runTime() {
// 定义
}
@Before("runTime()")
public void before(JoinPoint joinPoint) {
String name = joinPoint.getSignature().getName();
}
@After("runTime()")
public void after(JoinPoint joinPoint) {
String name = joinPoint.getSignature().getName();
}
@AfterReturning(value = "runTime()", returning = "result")
public void afterReturning(JoinPoint joinPoint, Object result) {
String name = joinPoint.getSignature().getName();
}
@Around("runTime()")
public Object around(ProceedingJoinPoint pjp) {
try {
String name = pjp.getSignature().getName();
Class declaringType = pjp.getSignature().getDeclaringType();
String declaringTypeName = pjp.getSignature().getDeclaringTypeName();
int modifiers = pjp.getSignature().getModifiers();
long startTime = System.currentTimeMillis();
Object result = pjp.proceed();
long endTime = System.currentTimeMillis();
long time = endTime - startTime;
log.info("Method name [{}] ----->执行时间:{}", declaringTypeName + "." + name, time);
return result;
} catch (Throwable th) {
th.printStackTrace();
throw new BusinessException(500, th.getMessage());
}
}
}