一、AOP即面向切向编程
AOP 是 Aspect Oriented Programming 的缩写,译为面向切向编程。用我们最常用的 OOP 来对比理解:
纵向关系 OOP,横向角度 AOP
举个小例子:
设计一个日志打印模块。按 OOP 思想,我们需要统计所有activity oncreate方法执行时间,需要在所有模块的activity中去统计耗时。
但是这个逻辑是横跨并嵌入众多模块里的,在各个模块里分散得很厉害,到处都能见到。设计时只使用 OOP思想可能会带来两个问题:
- 对象设计的时候一般都是纵向思维,如果这个时候考虑这些不同类对象的共性,不仅会增加设计的难度和复杂性,还会造成类的接口过多而难以维护(共性越多,意味着接口契约越多)。
- 需要对现有的对象 动态增加 某种行为或责任时非常困难。
而AOP就可以很好地解决以上的问题,怎么做到的?除了这种纵向分类之外,我们从横向的角度去观察这些对象,无需再去到处调用 方法耗时逻辑 了,声明哪些地方需要统计耗时,这个地方就是一个切面,AOP 会在适当的时机为你把打印语句插进切面。
如果说 OOP 是把问题划分到单个模块的话,那么 AOP 就是把涉及到众多模块的某一类问题进行统一管理。AOP的目标是把这些功能集中起来,放到一个统一的地方来控制和管理。利用 AOP 思想,这样对业务逻辑的各个部分进行了隔离,从而降低业务逻辑各部分之间的耦合,提高程序的可重用性,提高开发效率。
OOP 与 AOP 的区别
- 思想结构不同:OOP 是纵向结构,AOP 是横向结构。
- 注重方面不同:OOP 注重业务逻辑单元的划分,AOP 偏重业务处理过程中的某个步骤或阶段,可以统一处理某一类事物。
OOP 与 AOP 的联系
两者之间是一个相互补充和完善的关系。
二、应用场景
- 日志输出和方法计时;
- 动态权限申请;
- 无痕埋点
- 全局安全控制;
- 事件防抖
- 性能监控、统计
- 异常处理、事物处理
- 热修复、修改三方代码
三、AOP 方法
- APT
- AspectJ
- ASM
- Javassist