深度剖析spring aop原理

1.创建代理对象

在spring中创建bean实例都是从geBean()方法开始的,

在创建实例之后spring容器将会根据AOP的配置去匹配目标类的类名,看目标的类名是否满足切面规则,如果满足切面规则就会调用ProxyFactory去创建Bean,并且缓存到IOC容器中

然后根据目标对象自动选择不同的代理策略,如果目标类实现了接口,spring会默认实现JDK Proxy,如果目标类没有实现接口,Spring会默认选择Cglib Proxy

当然我们也可以通过配置强制使用Cglib Proxy

2.拦截目标对象

当用户调用对象目标的某个方法的时候,将会被一个叫做AOP Proxy的对象拦截,

Spring将所有的调用策略封装到了这个对象中,它默认实现了一个叫做InvocationHandler的接口,也就是调用代理对象的外层拦截器,在这个接口的invoke()方法中,

会触发MethodInvocation的proceed()方法,在proceed()方法中,会按顺序执行符合所有aop规则的拦截器链

3.调用代理对象

Spring Aop拦截器链中每个元素都会被命名为MethodInterceptor

其实也就是切面中的Advice通知,这个通知是可以用来回调,可以简单地理解成就是生成的代理Bean的方法,也就是我们常说的被织入的代码片段,这些被织入的代码片段会在这个阶段被执行

4.调用目标对象

MethodInterceptor,也有一个invoke()方法,在MethodInterceptor的invoke()方法中会触发对目标对象的调用,也就是去反射调用目标对象的方法

 

代理对象:由spring代理策略生成的对象

目标对象:我们自己写的业务代码

织入代码:在我们自己写的业务代码增加的代码片段

切面通知:封装织入代码片段的回调方法

MethodInvocation:负责执行拦截器链,在proceed()方法中执行

MethodInterceptor:负责执行织入的代码片段,在invoke()方法中执行

 

posted @   开源遗迹  阅读(302)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
点击右上角即可分享
微信分享提示