Spring框架之AOP面向切面编程

157 阅读3分钟

什么是AOP?

AOP(Aspect Oriented Programming)意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。

in general,不通过修改源代码的方式,在主干功能里添加新的功能。

1661785189537.png

一.AOP底层使用动态代理

1. 有两种情况动态代理

第一种:有接口情况,使用JDK动态代理

  • 创建接口实现类代理对象,增强类的方法 1661786791347.png

第二种:没有接口情况,使用CGLIB动态代理

  • 创建子类的代理对象,增强类的方法 1661826851019.png

AOP(JDK动态代理)

2.使用JDK动态代理,使用Proxy类里面的方法创建代理对象

  • 调用NewProxyInstance方法 方法有三个参数: 第一参数,类加载器 第二参数,增强方法所在的类,这个类实现的接口,支持多个接口 第三参数,实现这个接口InvocationHandler,创建代理对象,写增强的方法

3.JDK动态代理代码

  • 创建接口,定义方法
  • 创建接口实现类,实现方法
  • 使用Proxy类代理对象

4.AOP(术语)

  • 连接点 类里面哪些方法可以被增强,哪些方法就被成为连接点
  • 切入点 实际被真正增强的方法,称为切入点
  • 通知(增强)
    • 实际增强的逻辑部分称为通知(增强)
    • 通知有多种类型
      • 前置通知
      • 后置通知
      • 环绕通知
      • 异常通知
      • 最终通知 finally
  • 切面
    • 把通知应用到切入点的过程

二、实现AOP操作

AOP操作(准备)

Spring框架种一般都是基于AspectJ实现AOP操作 (*AspectJ不是Spring组成部分,独立AOP框架,一般把Aspect].和Spring框架一起使用,进行AOP操作 )

AspectJ实现AOP操作有两种方式:
1.基于xml配置文件实现
2.基于注解方式实现(使用)

在项目工程里引入AOP相关依赖 1661828905878.png

1661829010170.png

切入点表达式 作用:知道对哪个类里面的哪个方法进行增强 语法结构: execution([权限修饰符][返回类型][类全路径][方法名称].([参数列表]))

举例1:对com.atguigu.dao.BookDao类里面的add进行增强execution(*com.atguigu.dao.BookDao.add(..)) //两个..表示方法中的参数

举例2:对 com.atguigu.dao.BookDao类里面的所有的方法进行增强execution(com.atguigu.dao.BookDao.(..))

举例3:对com.atguigu.dao包里面所有类,类里面所有方法进行增强 com.atguigu.dao..*(..))

2.1 基于AspectJ注解方式实现(使用)

  • 创建类,在类中定义方法
  • 创建增强类,创建方法, 让不同方法代表不同的通知类型
  • 进行通知的配置
    • 在spring配置文件中,开启注解扫描。 1661830013689.png

    • 使用注解创建User和 UserProxy对象 1661830092954.png

    • 在增强类上面添加注解@Aspectv 1661830152831.png

    • 在spring配置文件中开启生成代理对象 1661830262579.png

  • 配置不同类型的通知

1661830832575.png

1661830859008.png

image.png

  • 相同切入点抽取

1661831043543.png

  • 有多个增强类对同一个方法进行增强,设置增强类优先级

在增强类上面添加注解@order(数字类型值),数字类型值越小优先级越高

2.2 基于AspectJ配置文件实现

  • 创建两个类,增强类和被增强类,创建方法
  • 在Spring配置文件中创建两个类对象 1661831596663.png
  • 在Spring配置文件中配置切入点

1661831808454.png