理解 什么是AOP
AOP,全称面向切面编程。 它可以说是对面向对象OOP的思想升华。从总的理解来讲,AOP是横向对不同程序的抽象。这个思想要不断实践动手之后,才会有很深刻的理解
理解 代理模式
在理解AOP之前,我们首先要单独说一个设计思想 就是代理模式。
简单来讲 就是 methodA()我不想把这个方法暴露出去,或者我想在这个方法的基础上给他加强一下。 那么我就可以创建一个methodB() 引入方法A为私有属性(外界无法访问),然后我在方法b中 对A改造也好 增强也罢 总之就是在a基础上搞来搞去,然后我把B公开给外部。 ——这种思想就叫代理
AOP思想的实现方案——动态代理技术
理解了代理,我们再说动态代理。 所谓的动态代理,就是运行期间 对目标对象的方法进行增强。就是上面说的 B 增强 A, B作为A的代理对象,它和A同名且 A的原有逻辑他全都有, 在这个原有逻辑的基础上 再嵌入其他逻辑或者方法。
AOP相关概念
aop里面有很多术语 我们照着图来看:
这样看就清晰了:
A是被B代理增强的 所以A是目标对象 生成了A的代理对象。
A的所有方法理论上都是可以被B的方法增强的,所以所有的方法都是连接点
A实际上只有方法1 和方法2 被增强,所以这俩方法是切入点 就是实际被增强的方法
其中方法1作为切点 和B对象的增强方法组合起来 这就是切面。
所以我们看到代理对象里面 有两个切面。
Spring 实现动态代理的两种方式
- JDK动态代理(默认)
- CGLIB 动态代理
问题来了 新手可能会晕 spring什么时候用哪种代理??
一句话就可以总结:
被代理的类对象有没有实现接口
如果有 默认使用 JDK动态代理。
如果没有 只能换成CGLIB 动态代理!
就这么言简意赅 你需要看你那个代理的类有没有实现接口。至于为什么 简单来说 jdk动态代理 它创建了一个代理类
而这个代理类——只 能 代 理 接 口