记录一些自己对Spring AOP粗浅的理解:(如有不对望大佬指正)
1.spring容器里所有的bean都会被代理,实现了接口的用的jdk代理,没有实现接口的用cglib代理。
2.每个bean会有多个方法拦截器,拦截器分内外两层,外层拦截器是由spring控制,内层拦截器由用户自己控制(自己定义的切面类,以及切点)。
3.每个方法被调用时都会先执行外层拦截器,外层拦截器决定执行哪些内层拦截器,内层拦截器的设计就是职责链模式。
可以讲Spring AOP分两部分来阐述:(代码位置:com.interface21.aop 包下)
- 代理的创建
- 首先需要创建代理工厂,代理工厂需要三个重要的信息:拦截器数组,目标对象接口数组,目标对象。
- 创建代理工厂时默认会在拦截器数组尾部加一个默认拦截器,用于最终调用目标对象方法,这个很好理解,无论有没有自己定义拦截器,最终都是要调用到目标对象本身的方法,这个拦截器必不可少。
- 调用getProxy方法获取代理对象,它会根据目标对象接口数组的大小(>0表示实现了接口,直接通过jdk代理,反之cglib)来决定是通过jdk代理还是cglib代理来返回一个代理对象。(创建代理对象的同时会创建一个外层拦截器用于对整个aop流程的控制)
- 代理的调用
- 调用代理的方法时会先调用外层拦截器。
- 外层拦截器根据代理配置信息创建内层拦截器链,根据表达式判断该拦截是否匹配当前拦截器,这边使用到了职责链模式。
- 最终调用到默认拦截器,执行对象方法,并将结果返回给拦截器,返回到最外层。