切面编程AOP(Aspect Oriented Programming)

AOP简介


  • 通过 预编译方式和运行期动态代理 实现 程序功能 的 统一维护 的一种技术。特点:低耦合,高聚合。

AOP能够将那些与业务无关,却为业务模块所共同调用的逻辑或责任,例如事务处理、日志管理、权限控制等,封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可操作性和可维护性。


  • AOP则是针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各部分之间低耦合性的隔离效果。

术语


  • Cross-cutting concerns(横切关注点): 尽管面向对象模型中大多数类会实现单一特定的功能,但通常也会开放一些通用的附属功能给其他类。例如,我们希望在数据访问层中的类中添加日志,同时也希望当UI层中一个线程进入或者退出调用一个方法时添加日志。尽管每个类都有一个区别于其他类的主要功能,但在代码里,仍然经常需要添加一些相同的附属功能。

  • Advice(通知): 注入到class文件中的代码。典型的 Advice 类型有 before、after 和 around,分别表示在目标方法执行之前、执行后和完全替代目标方法执行的代码。 除了在方法中注入代码,也可能会对代码做其他修改,比如在一个class中增加字段或者接口。

  • Joint point(连接点): 程序中可能作为代码注入目标的特定的点,例如一个方法调用或者方法入口。

  • Pointcut(切入点): 告诉代码注入工具,在何处注入一段特定代码的表达式。例如,在哪些 joint points 应用一个特定的 Advice。切入点可以选择唯一一个,比如执行某一个方法,也可以有多个选择,比如,标记了一个定义成@DebguTrace 的自定义注解的所有方法。

  • spect(切面): Pointcut 和 Advice 的组合看做切面。例如,我们在应用中通过定义一个 pointcut 和给定恰当的advice,添加一个日志切面。

  • Weaving(织入): 注入代码(advices)到目标位置(joint points)的过程。



## 实现机制


| 类别 |机制 |原理 |优点 |缺点 |
|:-----:|:-----:|:-----:|:------:|:----------:|
|静态AOP|静态织入 |在编译期,切面直接以字节码的形式编译到目标字节码文件中。 |节码文件中。对系统无性能影响。 |灵活性不够。 |
|动态AOP|动态代理 |在运行期,目标类加载后,为接口动态生成代理类,将切面植入到代理类中。 |相对于静态AOP更加灵活。 |切入的关注点需要实现接口。对系统有一点性能影响。 |
|动态字节码生成 |在运行期,目标类加载后,动态构建字节码文件生成目标类的子类,将切面逻辑加入到子类中。 |没有接口也可以织入(Weave)。 |扩展类的实例方法为final时,则无法进行织入。 | |
|自定义类加载器 |在运行期,目标加载前,将切面逻辑加到目标字节码里。 |可以对绝大部分类进行织入。 |代码中如果使用了其他类加载器,则这些类将不会被织入。 | |
|字节码转换 |在运行期,所有类加载器加载字节码前,前进行拦截。 |可以对所有类进行织入。 | | |

## AOP优点:

1. 降低模块的耦合度
2. 使系统容易扩展
3. 设计决定的迟绑定:使用AOP,设计师可以推迟为将来的需求作决定,因为它可以把这种需求作为独立的切面很容易的实现。
4. 更好的代码复用性

## AOP包括三个清晰的开发步骤:

1. 功能横切:找出横切关注点。
2. 实现分离:各自独立的实现这些横切关注点所需要完成的功能。
3. 功能回贴:在这一步里,方面集成器通过创建一个模块单元—— 方面来指定重组的规则。重组过程——也叫织入或结合—— 则使用这些信息来构建最终系统



## 参考

[Android中的AOP编程](http://www.jianshu.com/p/0fa8073fd144)


转载于:https://juejin.im/post/5a3230b7f265da431b6d39a0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值