1、概括
- 将与核心业务无关的代码独立的抽取出来,形成一个独立的组件(抽取公共代码的过程),然后以横向交叉的方式应用到业务流程当中的过程被称为AOP
- 优点
- 代码复用性强
-
代码易维护
-
使开发者更专注于业务逻辑
2、AOP的底层原理:
JDK动态代理技术
-
为接口创建代理类的字节码文件
-
使用ClassLoader将字节码文件加载到JVM
-
创建代理类实例对象,执行对象的目标方法
3、七大术语
- 连接点Joinpoint
- 指那些被拦截到的点(位置)。在spring中,这些点指的是方法,因为spring只支持方法类型的连接点
- 切点Pointcut
- 指我们要对哪些Joinpoint进行拦截的定义,在程序执行流程中,真正织入切面的方法(一个切点对应多个连接点)
- 切面Aspect
- 切点+通知就是一个切面,需要自己编写和配置
- 通知Advice
- 通知又叫增强,就是具体你要织入的代码
- 通知包括:
- 前置通知:befer
- 后置通知:after-returning
- 最终通知:after
- 异常通知:throwing
- 环绕通知:around
- 织入Weaving
- 把通知应用到目标对象上的过程(指把增强应用到目标对象来创建新的代理对象的过程)
- 代理对象 Proxy
- 一个目标对象被织入通知后产生的新对象
- 目标对象 Target
- 被织入通知的对象
- 整体图示如下:
4、切点表达式
- 切点表达式用来定义通知(Advice)往哪些方法上切入,语法格式如下:
-
execution([访问控制权限修饰符] 返回值类型 [全限定类名]方法名(形式参数列表) [异常])
-
- 访问权限控制符
- 可选项:没写就是4种权限都可以
- 返回值类型:
- 必填项:若为“*”,表示返回值类型任意
- 全限定类名:
- 可选项:两个点“..”表示当前包以及子包下的所有类,若省略,就表示所有的类
- 方法名:
- 必填项:“*”表示所有方法,set * 表示所有的set方法
- 形式参数列表
- 必填项:
- ():表示没有参数的列表
- (..) :参数类型和个数随意的方法
- (*): 只有一个参数的方法
- (*, String): 第一个参数类型随意,第二个参数是String的
- 必填项:
- 异常
- 可选项:省略是表示任意异常
- 例如:
-
execution(public * com.powernode.mall.service.*.delete*(..)) 表示返回值类型任意,处于com.powernode.mall.service包下的所有类的所有参数任意的deleteXxx方法 execution(* com.powernode.mall..*(..)) 任意修饰符、返回值类型的,处于com.powernode.mall报下的所有方法 execution(* *(..)) 表示该项目的所有方法
-