Spring AOP在Spring体系中深不可测,Spring AOP原理也是经常在互联网大厂面试时被问到,今天,我给大家抽丝剥茧,详细到你无法想象。我划分为四个阶段给大家介绍:创建代理对象阶段、拦截目标对象阶段、调用代理对象阶段、调用目标对象阶段。
我整理了一张完整的Spring AOP设计原理UML图,需要高清图的小伙伴可以私信我。
下面详细介绍每个阶段的执行细节。
1、第一阶段:创建代理对象阶段
在Spring中,创建Bean实例都是从getBean()方法开始的(出现getBean()动画),在实例创建之后,Spring容器将根据AOP的配置去匹配目标类的类名,看目标类的类名是否满足切面规则。如果满足满足切面规则,就会调用ProxyFactory创建代理Bean并缓存到IoC容器中。(出现调用ProxyFactory创建代理Bean动画)根据目标对象的自动选择不同的代理策略。(出现选择代理策略动画)如果目标类实现了接口,Spring会默认选择JDK Proxy,如果目标类没有实现接口,Spring会默认选择Cglib Proxy,当然,我们也可以通过配置强制使用Cglib Proxy。
2、第二阶段:拦截目标对象阶段
当用户调用目标对象的某个方法时,(出现AopProxy对象拦截)将会被一个叫做AopProxy的对象拦截,Spring将所有的调用策略封装到了这个对象中,它默认实现了InvocationHandler接口,也就是调用代理对象的外层拦截器。(出现调用InvocationHandler的invoke()方法动画)在这个接口的invoke()方法中,(出现触发MethodInvocation的proceed()方法动画)会触发MethodInvocation的proceed()方法。在这个方法中会按顺序执行符合所有AOP拦截规则的拦截器链。
3、第三阶段:调用代理对象阶段
Spring AOP拦截器链中的每个元素被命名为MethodInterceptor,(出现反射调用Advice对象
动画)其实就是切面配置中的Advice通知。这个回调通知可以简单地理解为是新生成的代理Bean中的方法。(出现执行织入代码动画)也就是我们常说的被织入的代码片段,这些被织入的代码片段会在这个阶段执行。
4、第四阶段:调用目标对象阶段
MethodInterceptor接口也有一个invoke()方法,(出现执行MethodInterceptor的invoke()方法动画)在MethodInterceptor的invoke()方法中会触发对目标对象方法的调用,也就是反射调用目标对象的方法。(出现调用目标对象动画)
Spring AOP原理就分析到这里,最后,总结一下不迷路:
1、代理对象:就是由Spring代理策略生成的对象;
2、目标对象:就是我们自己写的业务代码;
3、织入代码:就是要在我们自己写的业务代码增加的代码片段;
4、切面通知:就是封装织入代码片段的回调方法;
5、MethodInvocation:负责执行拦截器链,在proceed()方法中执行;
6、MethodInterceptor:负责执行织入的代码片段,在invoke()方法中执行。
都看到这里了,你还觉得Spirng AOP原理难吗?我再送给大家一张精简版的Spring AOP执行流程图,需要的小伙伴立马关注点个赞。
我是被编程耽误的文艺Tom,如果大家还有其他疑问,可以在评论区留言。如果本次面试解析对你有帮助,请动动手指一键三连分享给更多的人。关注我,面试不再难!
S信【Tom】或【666】即可免费领取需要更多干货内容,还有海量面试资料,只弹干货不惨水!
本文为“Tom弹架构”原创,转载请注明出处。技术在于分享,我分享我快乐!
如果本文对您有帮助,欢迎关注和点赞;如果您有任何建议也可留言评论或私信,您的支持是我坚持创作的动力。关注微信公众号『 Tom弹架构 』可获取更多技术干货!
我是被编程耽误的文艺Tom