1. @Target({ElementType.METHOD})
  2. @Retention(RetentionPolicy.RUNTIME)
  3. public @interface TimePrinter {
  4. }
  5. @Aspect
  6. @Component
  7. @Slf4j
  8. public class TimePrinterAspect {
  9. @Around("@annotation(printer)")
  10. public Object doAround(ProceedingJoinPoint joinPoint, TimePrinter printer) throws Throwable {
  11. Object ret;
  12. String method = getMethod(joinPoint);
  13. long start = System.currentTimeMillis();
  14. try {
  15. ret = joinPoint.proceed(joinPoint.getArgs());
  16. } catch (Throwable throwable) {
  17. log.error("TimePrinterAspect, invoke_error, method:{}", method, throwable);
  18. throw throwable;
  19. }
  20. log.info("TimePrinterAspect, invoke_success, method:{}, cost:{}ms", method, System.currentTimeMillis() - start);
  21. return ret;
  22. }
  23. private String getMethod(ProceedingJoinPoint joinPoint){
  24. return joinPoint.getSignature().getDeclaringTypeName().substring(
  25. joinPoint.getSignature().getDeclaringTypeName().lastIndexOf(".")) + "." +
  26. joinPoint.getSignature().getName();
  27. }
  28. }

Spring是如何实现AOP的

  • Spirng会把类装载到IOC容器中
  • 当需要创建对象时,会直接从IOC容器中获取
  • 从IOC容器中获取对象时,发现对象需要进行增强时就会生成代理对象,将增强部分生成到代理类中
  • 实际业务中调用的是增强后的代理对象,由代理对象再去调用目标对象,代理对象相当于做了一层包装


https://www.jianshu.com/p/6cd83774a312