AOP

AOP(面向切面编程)

问题:

  • 1.在程序开发时,可能有许多程序都需要一个相似的功能,且具有类似的代码,没有AOP之前,只能是在所有需要此功能的程序中多次写入功夫的代码,这样的代码在前期会影响开发的效率,在后期维护需要更改大量的代码,如下图:
    AOP

  • 2.人的需要总是不断上升的,当一个软件开发出来之后,如果需要增加功能,如:增加日志,增加安全检查,在没有AOP之前,我们只能在所有的模块中重复的写入相同的代码,这无疑增加开发的难度。

解决思路

  • 能否将这些重复的代码抽取出来,进行统一的编写和复用,如下图:

AOP

AOP

  • 定义:
    面向切面编程,面向的是横切面(aspect),
  • 思路
    1.将一些重复的代码从各个模块中,抽取出来封装到特殊的类中。
    2.在每次执行程序之前,要先执行指定好的特殊类。

  • AOP术语

    • 切面(Aspect):指横切关注点,指被抽取出来的模块。
    • 通知(Advice):被抽取出来的模块的具体动作,在代码中的表现是一个方法。
    • 目标(Target)):指被代理的对象。
    • 连接点(JoinPoint):指程序执行的某个位置,如:方法调用前,方法调用后,获取方法抛出异常后等。连接点有两个成分组成:

      1. 执行点:指某个位置。如:方法。
      2. 方位:指动作执行前或者后。
  • 切点:指描述连接点特征的抽象,用于定位连接点。

  • 具体做法
    1.使用代理模式,将重复的代码封装到代理对象中。
    2.执行程序调用的是代理对象,通过代理对象调用重复代码功能,再访问目标对象,完成功能的实现。


  • 代理的3种模式
    1.静态代理(编译时增强):
    通过让代理类实现与目标类一样的接口,在代理类中关联一个目标类,对于需要修改的方法进行修改,对于不需要修改的功能,直接使用关联的目标类进行调用。

2.动态代理(运行时增强):
通过jdk提供的反射机制中的Proxy类和InvocationHandler接口,实现在运行时,创建代理类的二进制文件及其实例,运行原理与静态代理类似。

3.CGLIB(子类代理,运行时增强)
在运行时,创建目标类的子类实例。