Spring-Aop
一、什么是Aop(https://blog.csdn.net/pedro7k/article/details/115415675)
AOP(面向切面编程)
- AOP可以说是OOP(Object Oriented Programming,面向对象编程)的补充和完善。
- 目的是并将那些影响了多个类的公共行为封装到一个可重用模块
- 它的实际含义是在运行时将重复的代码切入到类的指定方法、指定位置上,将不同方法的同一个位置抽象为一个切面对象,并对该对象进行编程
举一个例子,比如 在业务流程中,有三个业务都有要完成相同功能的行为,如果在三个业务中都写上相同的代码,就显得很多余冗余度增大,这时候可以利用面向切面编程的思维来解决,将相同的代码写在同一个位置,再将其插入到要完成该功能的地方,这样就减少了写重复的代码降低了耦合度,又利于维护管理
二、Aop的相关概念 (https://blog.csdn.net/q982151756/article/details/80513340)
- Joint point(连接点):表示在程序中明确定义的点,典型的包括方法调用,对类成员的访问以及异常处理程序块的执行等等,它自身还可以嵌套其它 joint point。
- Aspect(切面): Aspect 声明类似于 Java 中的类声明,在 Aspect 中会包含着一些 Pointcut 以及相应的 Advice。
- Pointcut(切点):表示一组 joint point,这些 joint point 或是通过逻辑关系组合起来,或是通过通配、正则表达式等方式集中起来,它定义了相应的 Advice 将要发生的地方。
- Advice(增强):Advice 定义了在 Pointcut 里面定义的程序点具体要做的操作,它通过 before、after 和 around 来区别是在每个 joint point 之前、之后还是代替执行的代码
- Target(目标对象):织入 Advice 的目标对象.
- proxy(代理): 应用通知的对象,详细内容参见设计模式里面的动态代理模式。
- Weaving(织入):将 Aspect 和其他对象连接起来, 并创建 Adviced object 的过程
Advice 的类型:
-
前置通知(@Before) 方法执行前调用
-
后置通知(@After) 方法执行后调用
-
返回通知(@AfterReturning) 方法返回后调用
-
异常通知(@AfterThrowing)方法出现异常调用
-
(@Around) 动态代理、手动推荐方法运行
环绕通知: try{ 前置通知 目标方法执行 返回通知 }catch(){ 异常通知 }finally{ 后置通知 }
切点表达式:
固定语法 execution(1 2 3.4.5(6))
1.访问修饰符
public / private
2.方法的返回参数类型
Sting int void
如果不考虑访问修饰符和返回值! 这两位整合成一起写 *
如果要考虑不行 要么都考虑,要么都不考虑! 不能出现 * String
3.包的位置
具体包:com.cqie.service.Impl
单层模糊:com.cqie.*.Impl *单层莫模糊
多层模糊:com..Impl ..任意层的模糊
细节: ..不能开头
找所有的包Impl包: com..Impl 不能写..Impl 写成: *..Impl ..不能开头
4.类的名称
具体:CalculatorPureImpl
模糊:*
部分模糊:*Impl
5.方法名 语法和类名一致
6.形参列表
没有参数()
有具体参数(String,int) 顺序有要求
模糊参数(..)有没有参数都可以,可以有多个
部分模糊:(String..) String后面有没有无所谓
(..int) 最后一个参数是int
(String..int)
三、实现动态代理的两种方式(https://www.wolai.com/oacbJpH1wPzGNoMAVnoELR)
JDK动态代理
操作的实现了接口的实体类,利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用 InvokeHandler来处理。
对实现了接口的类应用切面
CGLIB动态代理
利用ASM(开源的Java字节码编辑库,操作字节码)开源包,将代理对象类的class文件加载进来,通过修改其字节码生成子类来处理。
对没实现接口的类应用切面new
使用总结:
-
如果目标类有接口,选择使用jdk动态代理
-
如果目标类没有接口,选择cglib动态代理
-
如果有接口,接口接值
-
如果没有接口,类进行接值