spring中的@aspectj切点表达式函数都有哪些_APM基础: AspectJ

本文相关代码Github地址 mk_aspectj,有帮助的话Star一波吧。

《APM基础: AspectJ》 大纲

bf79128c0176112086266adc9c00b91f.png

作为Android开发,多多少少遇到过这种情况,我的App很卡,大概知道问题出现在哪?却无从下手,接受别人的工程代码写的一团糟,出现天大的bug,却因为不熟悉业务不敢乱动,有没有一种侵入性比较低,比较和谐的方式去修改业务代码呢
学习设计模式可以一定程度降低业务耦合度,不过那都是 OOP 的思想,今天我给大家带来一份 AOP 的切面编程思想,无侵入方式织入代码到业务。如果对你有所启发,欢迎点赞转发

一. 关键技术

那么问题来了?

  • 什么是 AOP?
  • AOP 有什么用?
  • AOP怎样学习?
小朋友,你是否有很多问号?

AOP 维基百科是这么说的?

spect-oriented programming (AOP) is a programming paradigm that aims to increase modularity by allowing the separation of cross-cutting concerns. It does so by adding additional behavior to existing code (an advice) without modifying the code itself, instead separately specifying which code is modified via a "pointcut" specification, such as "log all function calls when the function's name begins with 'set'". This allows behaviors that are not central to the business logic (such as logging) to be added to a program without cluttering the code, core to the functionality. AOP forms a basis for aspect-oriented software development

是不是挺晦涩难懂的,我这边简单总结一下吧。

  • AOP 即 面向切面编程,通过 AOP ,可以在编译器对代码进行动态管理,以达到统一维护的目的。
  • AOP 其实是 OOP 思想的一种延续,同时也是 Spring 框架的一个重要的模块

对 Java 后端开发,其实并不陌生,因为 Spring 动态代理织入 其实就是借助AOP 思想。它解决了什么问题呢?

  • 利用 AOP ,我们可以各个业务模块进行隔离,从而使得业务逻辑各个部分之间的耦合度降低,提高程序的可重用性,同时也会提高开发效率,比如:我们怎样做耗时测量,怎样在不修改代码前提下给指定业务库插入代码。
  • 利用 AOP ,我们可以在无侵入的状态下在宿主中插入一些代码逻辑,从而实现一些特殊的功能,比如: 日志埋点, 性能监控,动态权限控制,代码调试等。

既然 AOP 这么好,那么我们怎么学习他呢?学习一个工具,先得了解他的一些专业术语如:

a9dfd1ac977885b9e5db8f93eb8d482b.png
  • Advice: 增强
    • 增强是织入到目标类连接点的一段程序代码,在Spring框架中,增强除了被用于描述一段程序代码外,还拥有另外一个连接点相关信息,这便是执行点的方位。结合执行点方位信息和切点信息,我们就能找到特地的连接
  • JoinPoint: 连接点
    • 什么是连接点?
      • 一个类或者一个程序代码拥有一些具有边界性质的特定点,这种特定点称为JoinPoint
    • 连接点执行的某个特定的位置
  1. 类初始化前
  1. 类初始化后
  1. 类中某个方法调用前
  1. 方法抛出异常后
    • Spring 框架的缺陷
      • 只支持方法的连接点
        • 方法调用前 方法调用后 方法抛出异常 方法调用前后程序执行点织入
  • PointCut: 切点
    • 定位到某个连接点的查询工具,需要提供方位信息
  • Aspect: 切面
    • 组成部分 : 增强 + 切点
  • Weaving: 织入

6a15d1c83ea589371690c4e2d6b60fa2.png
    • 织入实现方式
      • 编译器织入
        • ajc 编译器提供
      • 类装载期织入
        • ClassLoader提供
      • 动态代理织入
        • 运行期为目标类添加增强生成子类
  • Target: 目标对象
    • 定义 PointCut
      • 我们需要对哪些地方增加额外的操作,通过PointCut查询JoinPoint
    • 告诉程序 JointCut 怎样增强 Advice
      • Aspect 里面被修复的对象叫 Target,完成AOP操作叫Weaving

掌握这些基础知识,AOP差不多就学会了,等等,这么快就学会了,不是还没走源码嘛,这个Spring我也没有太多研究过,后面有机会再和大伙过一遍,我们开始直接正入主题,进入我们的Title AspectJ 吧 ,学习 AspectJ 有一个很重要的基础,就是得了解AspectJ 注解,常见的切点表达式,只有这样,才能正确使用AspectJ,基于自定义Gradle Plugin 实现代码织入等一系列好玩的事情。

二. AspectJ

61823b36215441cec6edee237bf0452c.png

2.0.1 AspectJ 注解

79f3cb4d90700ce961d68f5b4aee5318.png

2.0.1.1 @AspectJ

  • 切面类,目的是让 ajc 编译器识别
@Aspect
public class MkOnClickListenerAspectJ {}

MkOnClickListenerAspectJ 类 在编译器 会被 AspectJ 的 ajc 编译器识别

2.0.1.2 @PointCut

  • 定义切点标记方法
@Pointcut("execution(void android.view.View.OnClickListener.onClick(..))")
    public void fastClickViewPointcut(JoinPoint point) {

        Log.e("fastClickViewPointcut", "------------------");

    }

Pointcut 注解用来匹配 OnClickListener 注解的 onClick 方法

2.0.1.3 @Before

  • 前置增强,在某个连接点之前执行
@Before("execution(void android.content.DialogInterface.OnClickListener.onClick(..))")
    public void fastClickViewBefore(JoinPoint point) {
        View view =  (View) point.getArgs()[0];
        Log.e("fastClickViewBefore", view.toString()+"------------------");
    }

这个切点表达式,可以匹配所有 android.content.DialogInterface.OnClickListener.onClick 方法,并在方法之前获取view,然后将其打印

2.0.1.4 @After

  • 后置增强,在某个连接点之后执行
@After("execution(void android.support.v7.app.AppCompatViewInflater.DeclaredOnClickListener.onClick(..))")
    public void fastClickViewAfter(JoinPoint point) {

      View view =  (View) point.getArgs()[0];
        Log.e("fastClickViewAfter", view.toString()+"------------------");
    }

上面的切点表达式,可以匹配所有DeclaredOnClickListener.onClick方法,并在方法之后获取 vie

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值