@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface TimePrinter {
}
@Aspect
@Component
@Slf4j
public class TimePrinterAspect {
@Around("@annotation(printer)")
public Object doAround(ProceedingJoinPoint joinPoint, TimePrinter printer) throws Throwable {
Object ret;
String method = getMethod(joinPoint);
long start = System.currentTimeMillis();
try {
ret = joinPoint.proceed(joinPoint.getArgs());
} catch (Throwable throwable) {
log.error("TimePrinterAspect, invoke_error, method:{}", method, throwable);
throw throwable;
}
log.info("TimePrinterAspect, invoke_success, method:{}, cost:{}ms", method, System.currentTimeMillis() - start);
return ret;
}
private String getMethod(ProceedingJoinPoint joinPoint){
return joinPoint.getSignature().getDeclaringTypeName().substring(
joinPoint.getSignature().getDeclaringTypeName().lastIndexOf(".")) + "." +
joinPoint.getSignature().getName();
}
}
Spring是如何实现AOP的
- Spirng会把类装载到IOC容器中
- 当需要创建对象时,会直接从IOC容器中获取
- 从IOC容器中获取对象时,发现对象需要进行增强时就会生成代理对象,将增强部分生成到代理类中
- 实际业务中调用的是增强后的代理对象,由代理对象再去调用目标对象,代理对象相当于做了一层包装
https://www.jianshu.com/p/6cd83774a312