您现在的位置是:首页 >学无止境 >Spring 5 笔记 - AOP网站首页学无止境

Spring 5 笔记 - AOP

龙泉太阿 2023-07-02 16:00:03
简介Spring 5 笔记 - AOP

1. AOP 简介

AOP:Aspect Oriented Programming, 面向切面编程或面向方面编程。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。

将日志记录,性能统计,安全控制,事务处理,异常处理等代码从业务逻辑代码中划分出来,通过对这些行为的分离,我们希望可以将它们独立到非指导业务逻辑的方法中,进而改变这些行为的时候不影响业务逻辑的代码。

通俗描述:不通过修改源代码方式,在主干功能里面添加新功能。

2. AOP 底层原理

2.1 AOP底层使用动态代理

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

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

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

  • 创建子类的代理对象,增强类的方法。

AOP(JDK 动态代理)

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

(1)调用newProxyInstance方法

方法有三个参数:

第一个参数:类加载器。

第二个参数:增强方法所在的类,这个类实现的接口,支出多个接口。

第三个参数:实现这个接口InvocationHandler,创建代理对象,写增强的方法。

JDK动态代理例子:

(1)创建接口,定义方法。

(2)创建接口实现类,实现方法。

(3)使用Proxy类创建接口代理对象

2.2 AOP术语

(1)连接点:类里面哪些方法可以被增强,这些方法称为连接点

(2)切入点:实际被真正增强的方法,称为切入点。

(3)通知(增强):实际增强的逻辑部分称为通知(增强)

通知有多种类型:

  • 前置通知:方法之前通知
  • 后置通知:方法之后通知
  • 环绕通知:方法之前之后都通知
  • 异常通知:方法异常时通知
  • 最终通知:类似于finally里的逻辑

(4)切面:是个动作,把通知应用到切入点的过程。

2.3 AOP操作(准备)

(1)Spring框架一般都是基于AspectJ实现AOP操作

  • 什么是AspectJ ?AspectJ不是Spring的组成部分,独立的AOP框架,一般把AspectJ和Spring框架一起使用,进行AOP操作。

(2)基于AspectJ实现AOP操作

  1. 基于xml配置文件实现
  2. 基于注解方式实现(实际使用得多)

(3)在项目工程里面引入AOP相关依赖

还需要其它三个Jar包来支持AspectJ,所需要的AspectJ支持包来源于Eclipse下面的一个子项目AspectJ,可到此项目的官网地址下载AspectJ支持包。同时也要下载aopalliance包并添加到项目中。

AspectJ支持包下载地址AspectJ Downloads | The Eclipse Foundation

选择合适的版本下载,下载的是一个.jar包。

Aopalliance下载地址:

方法一:Aopalliance下载地址:AOP Alliance (Java/J2EE AOP standard) - Browse /aopalliance at SourceForge.net,选择合适的版本进行下载

TIPS:如果有找不到的jar包,可到Compare, Download & Develop Open Source & Business Software - SourceForge 里找,一般都有的

方法二:Aopalliance下载地址:Index of /aopalliance

TIPS:如果找不到jar包,可到Index of里找,一般都有的

cglib的jar包下载地址:

Download cglib-2.1.95-sources.jar : cglib « c « Jar File Download

二、解压

AspectJ支持包解压:用压缩软件解压该jar包,并把解压后的文件夹放到合适的位置。如下图:

Aopalliance解压:用压缩软件解压,并把解压后的文件夹放到合适的位置。如下图:

下载完后需要导入如下三个Jar包:

将上面一共四个Jar包引入项目:

4)切入点表达式

  • 切入点表达式的作用:知道对哪个类里面的哪个方法进行增强。
  • 语法结构:

execution(【权限修饰符】【返回类型】【类全路径】【方法名称】(【参数列表】))

举例1:对com.menergy.spring5.UserDaoImpl类中的add方法进行增强

execution(* com.menergy.spring5.UserDaoImpl.add(..))

举例2:对com.menergy.spring5.UserDaoImpl类中的所有方法进行增强

execution(* com.menergy.spring5.UserDaoImpl.*(..))

举例3:对com.menergy.spring5包中的所有类中的所有方法进行增强

execution(* com.menergy.spring5.*.*(..))

2.4 AOP操作实例(AspectJ注解)

(1)创建类,在类里面定义方法

(2)创建增强类(编写增强逻辑)

  • 在增强类里面创建方法,让不同的方法代表不同的通知类型。

(3)进行通知的配置

步骤:

  1. 在Spring 的配置文件中,开启注解扫描(这里引入context和aop两个名称空间)。
  2. 使用注解创建User和UserProxy对象。
  3. 在增强类上面添加注解@Aspect。
  4. 在Spring 的配置文件中开启生成代理对象。
  • 在增强类里面,在作为通知方法上面添加通知类型注解,使用切入点表达式配置。

例子:

加入其它类型的通知进行测试:

测试异常通知:

注:异常发生时,“环绕之后”和“afterReturning(返回通知)”没有执行。

可以对公共切入点进行抽取:

多个增强类对同一个方法进行增强,可以设置增强类的优先级:

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

例子:其它同上,改变如下:

完全注解开发

原来的配置文件可以用一个配置类代替(不需要xml配置文件),如下:

原来的配置文件:

用配置类代替为:

2.5 AOP操作实例(AspectJ配置文件)

  1. 创建两个类,增强类和被增强类,创建方法
  2. 在Spring 配置文件中创建两个类的对象
  3. 在Spring 配置文件中配置切入点

例子:

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。