AOP-我所了解的面向切面

Posted 程序员的故事会

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AOP-我所了解的面向切面相关的知识,希望对你有一定的参考价值。

 AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。



在做项目中,我们时常会遇到这样一些问题,当前登录用户点击按钮时,需要先判断下这个用户是否具有权限,具有权限才能进行下一步操作,若没有则提示用户或跳转到其他地方。通常情况下,我们可能这样


到了后面,需要考虑多个页面或者多个按钮权限,我们可能先自定义一个OnClickListener,在回调中进行判断

AOP-我所了解的面向切面

除了上述这些方法之外,我们还有肯定还有他的,比如把这个判断封装起来,调用 OnClickListener时,在回调中直接调用。

突然有一天产品经理说,我们现在不提示了,改成如果没有权限,跳转到别的页面进行权限申请,这个时候,用第一种方法的若很多界面都是这样写的,没事那就改吧,反正就是复制粘贴的事情;用第二种方法的,可能改几行代码就行了。看到这里,通常我们都会问自己有没有更好的方法,来满足这样的需求修改。下面我们来正式介绍下AOP(面向切面):



01



AOP介绍


引言部分已经阐述了基本概念,这里不过多的赘述。下面介绍下常用的术语以及注解进行介绍

1、AOP术语

     1、通知、增强处理(Advice):就是你想要的功能,也就是上面说的日 志、耗时计算等。


     2、连接点(JoinPoint):允许你通知(Advice)的地方,那可就真多了,基本每个方法的前、后(两者都有也行),或抛出异常是时都可以是连接点(spring只支持方法连接点)。AspectJ还可以让你在构造器或属性注入时都行,不过一般情况下不会这么做,只要记住,和方法有关的前前后后都是连接点。


    3、切入点(Pointcut):上面说的连接点的基础上,来定义切入点,你的一个类里,有15个方法,那就有十几个连接点了对吧,但是你并不想在所有方法附件都使用通知(使用叫织入,下面再说),你只是想让其中几个,在调用这几个方法之前、之后或者抛出异常时干点什么,那么就用切入点来定义这几个方法,让切点来筛选连接点,选中那几个你想要的方法。


   4、 切面(Aspect):切面是通知和切入点的结合。现在发现了吧,没连接点什么事,连接点就是为了让你好理解切点搞出来的,明白这个概念就行了。通知说明了干什么和什么时候干(什么时候通过before,after,around等AOP注解就能知道),而切入点说明了在哪干(指定到底是哪个方法),这就是一个完整的切面定义。


   5、织入(weaving) 把切面应用到目标对象来创建新的代理对象的过程。

2、AOP注解与使用

  • @Aspect:声明切面,标记类

  • @Pointcut(切点表达式):定义切点,标记方法

  • @Before(切点表达式):前置通知,切点之前执行

  • @Around(切点表达式):环绕通知,切点前后执行

  • @After(切点表达式):后置通知,切点之后执行

  • @AfterReturning(切点表达式):返回通知,切点方法返回结果之后执行

  • @AfterThrowing(切点表达式):异常通知,切点抛出异常时执行

注:@Pointcut、@Before、@Around、@After、@AfterReturning、@AfterThrowing需要在切面类中使用,即在使用@Aspect的类中。


02


实际使用


上面 我们对aop已经做了个简单介绍,下面我们看看如何在android中使用


这里注意下,AOP仅仅只是个概念,实现它的方式(工具和库)有以下几种:

  • AspectJ: 一个 JavaTM 语言的面向切面编程的无缝扩展(适用Android)。

  • Javassist for Android: 用于字节码操作的知名 java 类库 Javassist 的 Android 平台移植版。

  • DexMaker: Dalvik 虚拟机上,在编译期或者运行时生成代码的 Java API。

  • ASMDEX: 一个类似 ASM 的字节码操作库,运行在Android平台,操作Dex字节码。


本篇的主角就是AspectJ,下面就来看看AspectJ方式的AOP如何在Android开发中进行使用吧。

一、AspectJ的引入

本文是使用android studio进行开发,若有进行eclipse请自行百度


1)添加核心依赖


AOP-我所了解的面向切面

注:这里我是使用jar包进行加载的,也可以通过

implementation 'org.aspectj:aspectjrt:1.8.9'


2)编写gradle编译脚本

AOP-我所了解的面向切面


3)添加gradle任务

AOP-我所了解的面向切面

注:直接粘贴到build.gradle文件的末尾即可,不要嵌套在别的指令中。


至此,基本的配置已经完成,下面我们看下如何使用

1、切点

这是界面上按钮点击事件的方法:


public void aopClick() {
System.out.println("用户有权限,可以随意删除~");
}

2、创建注解

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@interface check {
}

3、切面类

要织入一段代码到目标类方法的前前后后,必须要有一个切面类,下面就是切面类的代码:



4、使用

@check
public void aopClick() {
System.out.println("用户有权限,可以随意删除~");
}

5、执行结果


到这里 基本上也就完成了demo。

看下上面实现的方式后,只需要在需要调用的地方,直接加上即可。


当然,后面要判断其他权限时,我们也可在注解中加入对应的参数:

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@interface check {
String value();
int type();
}


获取对应的参数

check checkNet = signature.getMethod().getAnnotation(check.class);
if (checkNet != null) {
Context context = getContext(point.getThis());
if (context != null) {
if (CheckNetUtil.check(context)) {
String value = checkNet.value();
int type = checkNet.type();
return point.proceed();
}
}
}


最后

这里只是简单的说下如何使用,并未说明其原理,有兴趣可自行去了解下 。欢迎大家一起学习进步


 学无止境,不学怎么进步

以上是关于AOP-我所了解的面向切面的主要内容,如果未能解决你的问题,请参考以下文章

面向切面编程(AOP)在Android中的应用

[Spring] 面向切面

AOP 面向切面编程

AOP面向切面编程

Spring框架AOP面向切面编程

从源码入手,一文带你读懂Spring AOP面向切面编程