SpringAOP-图解SpringAOP实现原理-《Java笔记》

admin 2025-10-19 04:20:53 编程 来源:ZONE.CI 全球网 0 阅读模式

JavaSpringAOP

准备工作

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

2022-06-12-21-27-09-820117.png

Spring AOP自动代理时机

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

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

2022-06-12-21-27-10-007122.png

创建代理操作wrapIfNecessary

所有的重点都在wrapIfNecessary做了什么操作2022-06-12-21-27-10-119320.png

代理的方法调用

创建完代理,代理如果调用方法呢?以Jdk动态代理为例子,方法的调用将会触发invoke方法。2022-06-12-21-27-10-307412.png

Spring AOP拦截器的执行顺序

从上面可以看出,Spring AOP的代理invoke方法,其实是拦截器的执行。先了解一下Spring AOP的执行顺序,跟栈很像,后进先出2022-06-12-21-27-10-363011.png

AOP拦截器执行原理

那么这个拦截器链又如何保证before在after之前呢?而且还能保证find方法的执行顺序?这部分实现原理通过几句话是解释不完的,只能给出图大家了解个大概2022-06-12-21-27-10-447294.png具体拦截器源码:

  1. public class MethodBeforeAdviceInterceptor implements MethodInterceptor, BeforeAdvice, Serializable {
  2. private final MethodBeforeAdvice advice;
  3. @Override
  4. public Object invoke(MethodInvocation mi) throws Throwable {
  5. // 先调用before方法
  6. this.advice.before(mi.getMethod(), mi.getArguments(), mi.getThis());
  7. // 继续链式调用
  8. return mi.proceed();
  9. }
  10. }
  11. public class AfterReturningAdviceInterceptor implements MethodInterceptor, AfterAdvice, Serializable {
  12. private final AfterReturningAdvice advice;
  13. @Override
  14. public Object invoke(MethodInvocation mi) throws Throwable {
  15. // 先进行链式调用
  16. Object retVal = mi.proceed();
  17. // 再调用afterReturning方法
  18. this.advice.afterReturning(retVal, mi.getMethod(), mi.getArguments(), mi.getThis());
  19. return retVal;
  20. }
  21. }

压轴题:Spring AOP遇上循环依赖

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

总结

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

以太坊cppgolang区别 编程

以太坊cppgolang区别

以太坊是一种去中心化的开源平台,它采用智能合约技术,旨在构建和运行不受干扰的分布式应用程序。作为目前最受欢迎的区块链平台之一,以太坊提供了多种编程语言的支持,其
progolang 编程

progolang

Go语言(Golang)是由Google开发的一门静态类型编程语言。作为一名专业的Golang开发者,我深知这门语言的优势和特点。在本文中,我将介绍Golang
golangn个发送者 编程

golangn个发送者

Golang是一种开源的编程语言,由Google团队开发,旨在提高程序的并发性和简化软件开发过程。在Go语言中,有时需要向多个接收者发送信息。本文将介绍如何在G
golang技能图谱 编程

golang技能图谱

从互联网行业的快速发展到人工智能技术的日益成熟,各种编程语言也应运而生。而在这众多的编程语言中,Golang(即Go)作为一门强大且高效的开发语言备受关注。Go
评论:0   参与:  12