三、AOP
1. AOP 概念及原理
1.1 什么是 AOP
(1) AOP(Aspect-Oriented Programming: 面向切面编程) ,利用 AOP 可以对业务逻辑各个部分进行隔离。从而使得业务逻辑各部分耦合度降低,提高程序的可重用性,同时提高了开发的效率。
(2) 通俗描述:不通过修改源代码的方式,在主干功能里添加新功能。
(3) 举例:
假设现在项目经理有一个需求:在项目所有类的方法前后打印日志。
通过静态代理,我们可以实现此功能:
但是如果手动添加,程序员要为每一个目标类编写,如果当前的系统有成百上千个类,工作量就太大了。而利用动态代理,只需要少量的代码,且更加灵活和统一,有利于程序的扩展。
JDK 动态代理
1.2 底层原理
有两种情况动态代理
(1) 有接口情况,使用 JDK 动态代理
创建接口实现类代理对象,增强类的方法
(2) 没有接口情况,使用 CGLIB 动态代理
创建子类的代理对象,增强类的方法
1.3 AOP 术语
1、连接点
类里面哪些方法可以被增强,这些方法称为连接点
2、切入点
实际被增强的方法,成为切入点
3、通知(增强)
(1)实际被增强的逻辑部分称为通知(增强)
(2)通知有多种类型
前置通知
后置通知
环绕通知
异常通知
最终通知
4、切面
是动作,把通知应用到切入点的过程
2. AOP 操作
2.1 准备工作
1、Spring 框架一般都是基于 AspectJ 实现 AOP 操作
AspectJ 不是 Spring 组成部分,独立于 AOP 框架,一般把 AspectJ 和 Spring 框架一起使用,进行 AOP 操作
2、在项目工程里面引入 AOP 相关依赖
3、切入点表达式
(1)切入点表达式作用: 知道对哪个类里面的哪个方法可以进行增强
(2)语法结构: execution([权限修饰符][返回类型][类全路径][方法名称][参数列表])
例1: 对 com.spring5.demo.dao.UserDao 类里面的 add 方法进行增强
execution(* com.spring5.demo.dao.UserDao.add(..))
例2: 对 com.spring5.demo.dao.UserDao 类里面所有方法进行增强
execution(* com.spring5.demo.dao.UserDao.* (..))
例3: 对 com.spring5.demo 包里面所有类,类里面所有方法进行增强
execution(* com.srping5.demo.dao.*.* (..))
2.2 AspectJ 注解
1、创建类,在类里面定义方法
public class User {
public void add() {
System