AOP
2019-07-09 本文已影响0人
上山走18398
简介
- AOP即面向切面编程
- 纵向关系OOP与横向切面AOP对比
- AOP的实现
- AOP的优缺点
AOP的目标是把这些功能集中起来(把涉及到众多模块的某一类问题抽取出来),放到一个统一的地方来控制和管理
利用AOP的思想,这样对业务逻辑的各个部分进行隔离,从而降低业务逻辑各部分之间的耦合,提高程序的可重用性,提高开发效率,统一管理- AOP的应用场景
日志模块设计
- OOP设计模式
OOP世界中,每个功能放在一个模块里,把功能或者问题模块化
编写一个打印日志LogUtils类,然后在需要打印的地方导入引用即可,那如果日志模块的API修改呢???
优缺点:横跨并嵌入多个模块中,耦合严重,分散得很厉害,不便于管理
1.1 需要对现有的对象动态增加某种行为或者方法时非常困难;
- AOP设计思路
无需再到处调用LogUtils,声明哪些地方需要打印日志,这个地方就是一个切面
AOP的目标是把这些功能集中起来,放到一个统一的地方来控制和管理
//只需要声明哪些方法需要打印log,打印什么内容
public class ClassA{
@Log(msg = "onInitView")
private void initView(){}
}
应用场景
只要系统的业务模块需要引用通用模块,就可以使用AOP
1. 参数校验和判空
可以提前处理入参数据的异常,并封装好异常转化成结果对象返回给调用方,也让业务逻辑解耦变得独立
2. Android API 23+ 的权限控制
避免到处都是申请权限和处理权限的代码
3. 无痕埋点
4. 安全控制
比如全局的登录状态流程控制
5. 日志记录
6. 事件防抖
7. 性能统计
可以采用AOP思想对每个方法做一个切点,在执行之后打印方法耗时
8. 事务处理
声明方法,为特定方法加上事务,指定情况下(比如抛出异常)回滚事务
9. 异常处理
替代防御性的try - catch
10. 缓存
缓存某方法的返回值,下次执行该方法时,直接从缓存里获取
11. 软件破解
12. 热修复
AOP可以让我们在执行一个方法的前插入另一个方法,运用这个思路,可以把有bug的方法替换成我们下发的方法
AOP方法实现
静态代理
动态代理
- 考虑要在什么期间插入代码(编译,运行),选用合适的AOP方法
- 找准切点也就是代码可注入的点,比如一个方法的调用处或者方法内部
- 接着考虑怎么过滤方法,
- 过滤以后要以怎样的方式处理代码,执行前,执行后,还是包裹代码,还是替换目标代码
@AspectJ