首先我们要知道AOP是什么?AOP全称Aspect OrientedProgramming,即面向切面编程。在这里我不想去说什么是切面,什么是切点,什么是通知等等,相关博客很多,如果大家想知道可以自己去查,这里我希望用图像加代码方式将这些抽象的概念具体化给读者,给自己也捋一捋思路。
我们结合代码用图像一起说明,先看代码如下:
// 假设我们现在有一个Person类,其中有一个eat的方法 public class Person { private String name; public Person(String name){ this.name = name } public void eat() { System.out.println(name + "正在吃饭........"); } } // 我们在main函数中调用了这个方法,这也是我们的核心功能 public class Main { public static void main(String[] args) { Person person = new Person("zhangsan"); person.eat(); } }
我相信上面的代码不需要做解释。接下来假设我们要对所有person的eat方法统计耗时,我们的代码可能要变成这样
public class Main { public static void main(String[] args) { StopWatch stopWatch = new StopWatch(); Person person = new Person("zhangsan"); stopWatch.start(); person.eat(); stopWatch.stop(); long totalTimeMillis = stopWatch.getTotalTimeMillis(); System.out.println("总耗时"+totalTimeMillis); } }
现在我们整个程序可以用下面的图表示:
假设我们现在要为我们为我们程序添加一个sing的方法,也要为这个方法添加耗时统计,这个时候我们的程序变成了下面这个样子
两张图对比我们发现,耗时统计其实是我们系统的一个公用功能,并且不是我们的核心业务,如果我们想对eat方法一样,在方法执行前后执行一次时间采集,无疑是一种很低效的方法,而且代码的复用性也极差
现在我们将耗时统计从我们的系统中抽离出来,用如下的图示意
现在我们的目的是,在程序运行的工程中对eat方法跟sing进行性能监控,我们已经将性能监控的方法从我们系统中抽离出来了,现在要重新嵌进去,并且要适用于两个方法,该怎么做呢?
其实我们要做到的目标可以用下图表示
到这一步我相信大家应该会明白我想表达的意思了,我并不想去深究具体的概念,主要是帮助大家理解
在这个图形中,其实性能监控对应的就是我们的通知(advice),eat方法与sing方法就是我们的切点,红色的我标明的就是切面,这只是个抽象的概念,我这样说也只是为了方便大家理解。其实我自己而言,我更愿意将图中eat方法所代表的直线与红色切面相交的点认作为切点,更多的时候,我更愿意以几何的方式来理解切面,切点的含义,这也是我写这篇文章的原因,有什么不对的希望大家多多指正