Android中AOP的实际运用
一、AOP简介
AOP即面向切面编程,区别于OOP(面向对象编程)的功能模块化,AOP主要侧重于解决某一类的问题。曾经我也不知道面向切面到底是切的谁,直到我看到下面这个图才理解。
从上图可以看出,面向切面编程是在不影响原业务功能的情况下,将我们所需要的功能插入进原业务代码中。
通俗的讲,比如在我们的android商城应用中,点击按钮跳转到功能界面时,很多地方都判断用户是否已登录,若用户已登录则跳转到功能界面,一般,我们的代码会这么写:
public void goToFun() {
if(LoginUtil.isLogin()) {
startActivity(new Intent(MainActivity.this, FunctonActivity.class));
} else {
startActivity(new Intent(MainActivity.this, LoginActivity.class));
}
}
而在AOP思想中,代码会写成这样:
@CheckLogin
public void goToFun() {
startActivity(new Intent(MainActivity.this, FunctonActivity.class));
}
乍一看,你可能会觉得代码并没有精简多少,但是若判断场景更加复杂、判断场景更多的时候,这样的写法很显然会非常冗余,并影响阅读体验。AOP的精髓就在于,不影响原代码业务逻辑的情况下,通过编译时注入代码的方式,通用的插入新的代码逻辑,效率高,侵入性低。
二、应用场景
AOP思想是用来解决一系列相同问题的方案,它可以运用的场景很多,比如:日志打印,性能监测,埋点方案等。
三、AOP实现方法
AOP是一种编程思想,实现它的框架有很多,其中最有名的是AspectJ,本文也是用AspectJ框架实现的。
1.AspectJ简介
拥有自己的编译器和语法,可以在编译期间将需要植入的代码编译成Java代码插入到你的源代码文件当中,它是一种几乎和Java完全一样的语言,而且完全兼容Java(AspectJ应该就是一种扩展Java,但它不是像Groovy那样的拓展)。
基础概念
在学习AspectJ之前,要先简单的了解一下几个概念,这个稍微了解一下就好了,不懂也没关系,看后面的示例就好了。
-
Advice(通知): 注入到class文件中的代码。典型的 Advice 类型有 before、after 和 around,分别表示在目标方法执行之前、执行后和完全替代目标方法执行的代码。 除了在方法中注入代码,也可能会对代码做其他修改,比如在一个class中增加字段或者接口。
-
Joint point(连接点): 程序中可能作为代码注入目标的特定的点,例如一个方法调用或者方法入口。
-
Pointcut(切入点): 告诉代码注入工具,在何处注入一段特定代码的表达式。例如,在哪些 joint points 应用一个特定的 Advice。切入点可以选择唯一一个,比如执