灵魂画手:图解Spring AOP实现原理 您所在的位置:网站首页 aop基于什么原理实现 灵魂画手:图解Spring AOP实现原理

灵魂画手:图解Spring AOP实现原理

2023-09-26 07:07| 来源: 网络整理| 查看: 265

点击上方“芋道源码”,选择“设为星标”

管她前浪,还是后浪?

能浪的浪,才是好浪!

每天 10:33 更新文章,每天掉亿点点头发...

源码精品专栏

原创 | Java 2021 超神之路,很肝~ 中文详细注释的开源项目 RPC 框架 Dubbo 源码解析网络应用框架 Netty 源码解析 消息中间件 RocketMQ 源码解析 数据库中间件 Sharding-JDBC 和 MyCAT 源码解析作业调度中间件 Elastic-Job 源码解析分布式事务中间件 TCC-Transaction 源码解析Eureka 和 Hystrix 源码解析Java 并发源码

来源:bugpool.blog.csdn.net/

article/details/105352273

准备工作Spring AOP自动代理时机创建代理操作wrapIfNecessary代理的方法调用Spring AOP拦截器的执行顺序AOP拦截器执行原理压轴题:Spring AOP遇上循环依赖总结

本篇旨在让读者对Spring AOP实现原理有一个宏观上的认识,因此会丢失一些细节,阅读本篇文章前,希望读者对Spring Ioc以及Spring AOP的使用(@Aspect)由一定了解,话不多说,直接上图

准备工作Service类: 有find方法跟save方法,find方法前后需要缓存操作,save方法前后需要事务操作CacheableAspect切面类: 用于在Service的find方法前后进行缓存操作TransctionlAspect切面类: 用于在Service的save方法进行事务操作LogAspect切面类: 记录所有Controller的请求日志

基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能。 项目地址:https://github.com/YunaiV/ruoyi-vue-pro

Spring AOP自动代理时机

在service bean的创建过程中(也就是getBean("service")),AOP通过BeanPostProcess后置处理器操作进行介入 分为2种情况:

用户自定义了targetSource,则bean的创建(实例化、填充、初始化)均由用户负责,Spring Ioc不会在管该代理目标对象traget,这种情况基本上不会发生,很多人用了几年Spring可能都不知道有它的存在正常情况下都是Spring Ioc完成代理对象target的实例化、填充、初始化。然后在初始化后置处理器中进行介入,对bean也就是service进行代理

基于微服务的思想,构建在 B2C 电商场景下的项目实战。核心技术栈,是 Spring Boot + Dubbo 。未来,会重构成 Spring Cloud Alibaba 。 项目地址:https://github.com/YunaiV/onemall

创建代理操作wrapIfNecessary

所有的重点都在wrapIfNecessary做了什么操作

代理的方法调用

创建完代理,代理如果调用方法呢?我们以Jdk动态代理为例子,方法的调用将会触发invoke方法。

Spring AOP拦截器的执行顺序

从上面可以看出,Spring AOP的代理invoke方法,其实是拦截器的执行。

我们先了解一下Spring AOP的执行顺序,跟栈很像,后进先出

AOP拦截器执行原理

那么这个拦截器链又如何保证before在after之前呢?而且还能保证find方法的执行顺序?

这部分实现原理通过几句话是解释不完的,只能给出图大家了解个大概

具体拦截器源码:

public class MethodBeforeAdviceInterceptor implements MethodInterceptor, BeforeAdvice, Serializable {  private final MethodBeforeAdvice advice;  @Override  public Object invoke(MethodInvocation mi) throws Throwable {   // 先调用before方法   this.advice.before(mi.getMethod(), mi.getArguments(), mi.getThis());   // 继续链式调用   return mi.proceed();  } } public class AfterReturningAdviceInterceptor implements MethodInterceptor, AfterAdvice, Serializable {    private final AfterReturningAdvice advice;    @Override    public Object invoke(MethodInvocation mi) throws Throwable {       // 先进行链式调用       Object retVal = mi.proceed();       // 再调用afterReturning方法       this.advice.afterReturning(retVal, mi.getMethod(), mi.getArguments(), mi.getThis());       return retVal;    } }压轴题:Spring AOP遇上循环依赖

该部分难度系数十颗星,算是Spring源码最复杂的一块,这块弄懂可以说对Spring的理解已经达到阿里水准了。这里三言两语是不可能解释清楚的,只能贴个图,大家有个宏观上的认知。

总结

Spring AOP是Spring重要的组成部分之一,本篇只是给读者宏观上的一个认识,具体还是需要阅读源码。

欢迎加入我的知识星球,一起探讨架构,交流源码。加入方式,长按下方二维码噢:

已在知识星球更新源码解析如下:

最近更新《芋道 SpringBoot 2.X 入门》系列,已经 101 余篇,覆盖了 MyBatis、Redis、MongoDB、ES、分库分表、读写分离、SpringMVC、Webflux、权限、WebSocket、Dubbo、RabbitMQ、RocketMQ、Kafka、性能测试等等内容。

提供近 3W 行代码的 SpringBoot 示例,以及超 4W 行代码的电商微服务项目。

获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。

文章有帮助的话,在看,转发吧。谢谢支持哟 (*^__^*)


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有