程序员晋级之路——初识AOP

简介: 程序员晋级之路——初识AOP

前言


何为AOP?AOP就是面向切面的编程。

何为面向切面的编程?就像高速公路的省界收费站一样,每条进出我们省的高速都会在省界上设立一个收费站,那么省界就是一个切面,收费站就是我们的处理方案,我们需要做的是定义省界这个面和在面上的收费站的功能。


应用场景


在项目完成之后,交付之前我们一般会对程序进行压力测试,在测试中怎么更加精准的定位系统运行的瓶颈呢?这时候你需要AOP监测每个接口甚至每个方法执行的时间!

在项目做异常处理时,我们怎样才能更加简单明了,将所有异常统一截取到同一个方法中进行处理?这时候你需要AOP将抛出的异常接受并处理!

AOP的定义非常灵活,可以是返回值类型,也可以是注释,也可以是某一个包下的所有方法或者指定方法,所以学习AOP之后,你不需要担心没有用武之地!


AOP结构


首先需要在这个类上添加一个@Aspect注释,这就声明了这个类是一个切面。

如下例子,将所有返回值为指定类型的方法定义为一个切面:

@Aspect
@Component
@Slf4j
public class ResultAspect {
  // 切入点  所有返回值类型是com.test.xbo包下ResultBO的方法
  @Pointcut("execution(public com.test.xbo.ResultBO *(..))")
  public void ResultAspect() {
  }
  // 环绕通知,参数必须为ProceedingJoinPoint,proceed就是被切面的方法
  @Around("ResultAspect()")
  public Object deAround(ProceedingJoinPoint joinPoint) throws Throwable {
      long startTime = System.currentTimeMillis();
      joinPoint.proceed();
      String str = "## 控制器运行时间:" + joinPoint.getSignature() + ":" + (System.currentTimeMillis() - startTime);
    return null;
  }
}


再如,我定义一个注释,将所有添加该注释的方法定义为一个切面:

1、定义一个注释,添加该注释的方法会打印出该方法执行的时间:


@Target({ ElementType.METHOD, ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
public @interface DoneTime {
  String param() default "";
}


2、定义一个切面

@Aspect
@Component
@Slf4j
public class DoneTimeAspect {
  @Around("@annotation(doneTime)")
  public Object around(ProceedingJoinPoint joinPoint, DoneTime doneTime) throws Throwable {
    long startTime = System.currentTimeMillis();
    Object o = joinPoint.proceed();
    String str = "## DoneTime-" + joinPoint.getSignature() + ":" + (System.currentTimeMillis() - startTime);
    log.error(str);
    return o;
  }
}

这样我们就完成了两个非常典型的AOP切面的例子!

相关文章
|
2月前
|
程序员 定位技术
编程之路:从迷茫到精通的心路历程
在编程的世界里,每个新手都像是一名初登航船的航海者,面对着波涛汹涌的知识海洋。本文将分享一位程序员的成长故事,从大学毕业时的迷茫,到勇敢尝试新领域的冒险,再到不断学习和提升,最终找到属于自己的人生方向。正如乔布斯所说:“人生中的每一个点都会在未来某个时刻连接起来。”让我们跟随这段旅程,探索如何在编程之路上,从初心到精通,绘制出一幅精彩纷呈的技术地图。
33 11
|
6月前
|
Java 数据库连接 开发者
从零到一:JAVA反射技术的“逆袭”之路
【7月更文挑战第1天】Java反射技术,从高级特性走向普及,核心是Class类,用于运行时检查和操作类信息。在Spring等框架中,反射实现DI和AOP,提升灵活性。动态代理通过Proxy和InvocationHandler实现方法拦截。反射现已成为Java不可或缺的工具,未来潜力无限。
26 0
|
7月前
|
安全 Java 程序员
【C++航海王:追寻罗杰的编程之路】继承你学会了么?
【C++航海王:追寻罗杰的编程之路】继承你学会了么?
34 0
|
编译器 C语言 C++
【C++修炼之路】类和对象(中)—— 筑基篇
【C++修炼之路】类和对象(中)—— 筑基篇
37450 0
【C++修炼之路】类和对象(中)—— 筑基篇
|
敏捷开发 监控 安全
|
存储 编译器 C++
【C++修炼之路】类和对象(中)—— 筑基篇2
【C++修炼之路】类和对象(中)—— 筑基篇
94 0
【C++修炼之路】类和对象(中)—— 筑基篇2
|
编译器 C++
【C++修炼之路】类和对象(中)—— 筑基篇3
【C++修炼之路】类和对象(中)—— 筑基篇
68 0
【C++修炼之路】类和对象(中)—— 筑基篇3
|
传感器 机器学习/深度学习 Kubernetes
2023年的程序员将何去何从
2023年的程序员将何去何从
|
设计模式 运维 Kubernetes
15年老司机聊程序员成长的28个要点
15年老司机聊程序员成长的28个要点
376 1
|
设计模式 uml 容器
大厂技术布道师!就这么使用责任链模式,绝对没错!
大厂技术布道师!就这么使用责任链模式,绝对没错!
139 0
大厂技术布道师!就这么使用责任链模式,绝对没错!