0%

AOP基础概念

[toc]
OOP(面向对象)无法解决系统需求(即所有业务模块的通用需求)的实现在系统中各处散落的问题

AOP: 面向切面编程

c202d80ab64f3b6840f064a267a68a99c312ee05

三种AOP类型#

静态AOP:#

第一代AOP, AspectJ.
优点: 直接以Java字节码编译到java类中,不会对系统造成性能损失,
缺点:不够灵活,如果需要修改插入位置,就要重新编译。

动态AOP:#

在系统运行后插入到系统中, 且织入信息以外部XML文件格式保存。
缺点:性能有问题。但已经可以容忍这种损失j

java自带的AOP:#

  1. 动态代理 缺点:只针对接口有效,且必须实现接口,有局限性
    2. 动态字节码增强: 修改class文件的字节码来插入一些操作缺点: 如果要扩展的类或者方法声明为final,就不能进行子类化扩展
    3. java代码生成, 通过工具生成代码部署到原代码中早起EJF容器使用最多,现在已经不用了
    4. 自定义类加载器在类加载的时候,通过类加载器,修改读入的class字节码数据缺点:某些服务器可能不支持自定义或者本身类加载器会控制整个类加载体系,导致冲突
    5. AOL扩展:直接用AOL这个语言去做。这个最强,也最难用。

AOP概念#

Joinpoint 切入点#

切入点的位置选择共有7处:

  • 方法调用 : 外部调用时的位置,还没进去
  • 方法执行: 调用方法的内部的之前, 在方法调用之后
  • 构造方法调用
  • 字段设置 set或者this.xxx=xxx
  • 字段获取 getxxx
  • 异常处理执行
  • 类初始化

PointCut#

我认为是joinPoint的集合描述即如何描述
属于同一批的joinpoint, 即切到哪些地方?怎么描述我要切入的点?
4种表述方式:

  1. 直接指定joinpoint所在方法名称
  2. 正则表达式3
  3. 使用特定的表述语言
  4. 在1-3的基础上,进行pointcut计算

Advice#

代表你要怎么织入到joinpoint,即合适执行切面方法的策略, 在之前还是之后,还是其他。

  1. beforAdvice
    在joinpoint指定位置之前执行
    不会中断程序执行流程

  2. AfterAdvice
    在连接点之后执行的advice类型。还可以细分
    ① After return Advice 只有连接点完全执行完后,且无异常,才执行切面方法
    ②After throwing advice 只有抛出异常才执行
    ③After Advice ①和②的结合。
    55b7e304a004c8a0a9c266fb2fa416bea8c747a4

  3. Aroud Advice
    可以在joinpoint的之前之后都进行执行设置,类似于进行了包裹

  4. Introduction

根据jointPoint可以完成的功能来区分

Aspectpointcut#

和advice定义的封装实体
79cf416c8cc6bba1c32c878c410338da309aaa4d
包含以下内容

  • 织入器
    通过什么方式去织入,即实现, 例如类加载器之类的

  • 目标对象
    符合pointCut条件,将被织入的对象,称为目标对象
    cbabf8d110b5cb869c5d9b975860b831001151eb


AOP应用案例:
异常捕捉:
62e0eff9d85533f8e8d8fd0bee1708e3fbe6e50b
可针对unchecked excpetion进行Fault Barrier的切入

安全检查:
1661957687639

调用每个方法前都做一下检查

缓存:
63e8d127f0be72f456bf449370b9f5c2e8f9ce26
key可以理解为输入参数?

不过Spring已经支持Caching产品了使用了