深度剖析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()方法中执行
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报