@Target({ElementType.METHOD})@Retention(RetentionPolicy.RUNTIME)public @interface TimePrinter {}@Aspect@Component@Slf4jpublic 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