Spring 5 笔记 - AOP
1. AOP 简介
AOP:Aspect Oriented Programming, 面向切面编程或面向方面编程。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
将日志记录,性能统计,安全控制,事务处理,异常处理等代码从业务逻辑代码中划分出来,通过对这些行为的分离,我们希望可以将它们独立到非指导业务逻辑的方法中,进而改变这些行为的时候不影响业务逻辑的代码。
通俗描述:不通过修改源代码方式,在主干功能里面添加新功能。
2. AOP 底层原理
2.1 AOP底层使用动态代理
第一种:有接口的情况,使用JDK动态代理
- 创建接口实现类代理对象,增强类的方法。
第二种:没有接口的情况,使用CGLIB动态代理
- 创建子类的代理对象,增强类的方法。
AOP(JDK 动态代理)
- 使用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操作
- 基于xml配置文件实现
- 基于注解方式实现(实际使用得多)
(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)进行通知的配置
步骤:
- 在Spring 的配置文件中,开启注解扫描(这里引入context和aop两个名称空间)。
- 使用注解创建User和UserProxy对象。
- 在增强类上面添加注解@Aspect。
- 在Spring 的配置文件中开启生成代理对象。
- 在增强类里面,在作为通知方法上面添加通知类型注解,使用切入点表达式配置。
例子:
加入其它类型的通知进行测试:
测试异常通知:
注:异常发生时,“环绕之后”和“afterReturning(返回通知)”没有执行。
可以对公共切入点进行抽取:
多个增强类对同一个方法进行增强,可以设置增强类的优先级:
- 在增强类上面添加注解@Order(数字类型值),数字值越小优先级越高。
例子:其它同上,改变如下:
完全注解开发
原来的配置文件可以用一个配置类代替(不需要xml配置文件),如下:
原来的配置文件:
用配置类代替为:
2.5 AOP操作实例(AspectJ配置文件)
- 创建两个类,增强类和被增强类,创建方法
- 在Spring 配置文件中创建两个类的对象
- 在Spring 配置文件中配置切入点
例子: