1.首先AOP是一种思想,我们不能将它局限于某种语言。
比方说我们在大脑中构造一个桌子,我们可以用木头做桌子,也可以用石头做桌子,也可以用塑料做桌子。而AOP就像大脑中构造的桌子,木头、石头、塑料就相当于是实现AOP的各种编程语言。
2、AOP是软件开发进步的产物,是对面向对象开发模式的补足。可以从以下几点分析
(1)为了提高开发效率:汇编语言---->高级语言
我们都知道起初的程序员都是一个一个的扣汇编指令,这样的开发效率可想而知。先辈们为了提高开发效率,各种高级编程语言如雨后春笋般冒了出来,这大大提高了软件的开发效率。
(2)为了便于维护和扩展:过程化编程---->面向对象编程(OOP及Object-Oriented Software Development)
开发语言虽然变高级了,但是开发思想还是比较落后的,怎么说呢?我们的编程方式是"顺序"编写下去的,这样的代码是不便于维护和扩展的,而且特别冗余。这是就有人提出了OOP思想。大家一看这思想还不错,然后开发就开始采用这种思想了。
(3)对OOP开发模式的补足:面向对象编程(OOP)+面向方面编程(AOP及Aspect-Oriented Programming)
高级语言+OOP思想就无敌了吗?不然。开发中为了调试,或进入生产环境后为了对系统进行监控,我们需要为这些业务需求的实现对象添加日志记录功能。或者进行安全检测。比方说就我就像在所以函数的函数体的第一句输出一下参数的情况,这是不是很麻烦,一句句的system.out.println(“参数1,参数2.。。。”);?如果我想在这个输出中在加点其它东西呢,是不是特别不易于维护。那么为了解决这些问题AOP思想就出来了。
大家一定见过传输带吧,我们编写的业务需求代码就好比传输带上的物品。而我们现在有一个系统需求,就是需要将传输带上红色的物品旋转180°,那么最好的办法是不是我们站在传输带旁边看着,一发现有红色的物品我们手动将物品旋转180°然后放好。
业务需求:系统的功能,用户需要的功能,这叫业务需求。
系统需求:就是程序员想要干的事,和这个系统本来的功能没太大的关系。
是不是可以看出传输带上的物品与我们站在传输带旁工作是不是两个完全不同的维度,这就是为什么说AOP是面向切面编程,它是横切到代码中的。
实现AOP的语言称为AOL(Aspect-Oriented Language)。
AOL可以与系统的实现语言相同,也可以是其它语言。
如对Java语言进行扩展而形成的AOL语言AspectJ,当然还有
AspectC;
AspectC++;
AspectNet;
Aspect(Lisp);
AspectPHP;
…
AOL实现的各种AOP概念实体,最终都需要某种方式集成到系统实现语言所实现的OOP实体组件中。所以,系统实现语言通常称为系统中使用的AOL的”寄生语言“,而将AOP组件集成到OOP组件的过程,在AOP中称之为织入(Weave)过程。
第一代AOP
编译期间进行织入
代表AspectJ
特点:相应的横切关注点以Aspect形式实现之后,会通过特定的编译器,将实现后的Aspect编译并织入到系统的静态类中。比如,Aspect会使用ajc编译器将各个Aspect以Java字节码的形式编译到系统的各个模块中,以达到融合Aspect和Class的目的。
优点:Aspect直接以Java字节码的形式编译到Java类中,Java虚拟机可以像通常一样加载Java类运行(因为编译完成的Aspect是完全符合Java类规范的),不会对整个系统的运行造成任何的性能损失。
缺点:灵活性不够。如果横切关注点需要改变织入到系统的位置,就需要重新修改Aspect定义文件,然后使用编译器重新编译Aspect并重新织入到系统中。
第二代AOP
运行期间进行动态织入
特点:AOP的织入过程在系统运行开始后进行,而且织入信息与系统模块分开,可以在调整织入点以及织入逻辑单元的同时,不必变更系统其它模块,甚至在系统运行的时候,可以动态更改织入逻辑。
缺点:相应的性能损耗(损耗小,可以接收)
这样理解Aspect
Aspect之对于AOP,就相当于Class之对于OOP。
我们说过AOP是对OOP方法的一种补足,当我们把以Class形式模块化的业务需求和以Aspect形式模块化的系统需求拼装到一起的时候,整个系统就算完成了。
下面写个业务需求,便于举例子
业务需求:输出“博主真帅”
/**
* @author 齐天大圣
* @Version 1.0
*/
public class TestDemo {
public void f01(){
System.out.println("博主真帅");
}
}
1、横切关注点:系统需求(程序员想看看的东西,与系统本来的功能无关)。
比如说我像在调用f01方法之前输出一段话“博主真的真的好帅”,那么这个行为就是横切关注点
2、织入:将AOP组件集成到OOP组件的过程。
3、连接点(Joinpoint):在系统运行前,AOP的功能模块都需要织入到OOP的功能模块中。所以,要进行这种织入过程,我们需要知道在系统的哪些执行点上进行织入操作,这些将要在其之上进行织入操作的系统执行点就称之为Joinpoint。
在这个方法前输出“博主真的真的好帅”,那这个“前”的这个地方的这个点就是Joinpoint。
4、切入点(Pointcut):Joinpoint的表述方式。
表述出上面的那个点的位置,想想经纬度。
5、通知(Advice):是单一横切关注点的载体,它代表将会织入到Joinpoint的横切逻辑。如果将Aspect比作OOP的Class,那么Advice就相当于Class中的Method。(将你需要干的系统业务封装起来)
6、切面(Aspect):是对系统中的横切关注点逻辑进行模块化封装的AOP概念实体。通常情况下,Aspect可以包含多个Pointcut以及相关Advice定义。