spring aop工作原理_注解的实现原理

spring aop工作原理_注解的实现原理本篇旨在让读者对SpringAOP实现原理有一个宏观上的认识,因此会丢失一些细节,具体实现参考:老实人Spring源码目录阅读本篇文章前,希望读者对SpringIoc以及SpringAOP的使用(@Aspect)由一定了解,话不多说,直接上图准备工作Service类:有find方法跟save方法,find方法前后需要缓存操作,save方法前后需要事务操作CacheableAspec…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

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

准备工作

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

Spring AOP自动代理时机

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

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

Spring AOP代理时机

创建代理操作wrapIfNecessary

所有的重点都在wrapIfNecessary做了什么操作
Spring AOP创建代理

代理的方法调用

创建完代理,代理如果调用方法呢?我们以Jdk动态代理为例子,方法的调用将会触发invoke方法。具体源码参考Jdk动态代理 底层源码
AOP方法执行原理

Spring AOP拦截器的执行顺序

从上面可以看出,Spring AOP的代理invoke方法,其实是拦截器的执行。
我们先了解一下Spring AOP的执行顺序,跟很像,后进先出
拦截器的执行顺序

AOP拦截器执行原理

那么这个拦截器链又如何保证beforeafter之前呢?而且还能保证find方法的执行顺序?详情参考MethodInvocation拦截器调用原理
这部分实现原理通过几句话是解释不完的,只能给出图大家了解个大概
在这里插入图片描述具体拦截器源码:

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遇上循环依赖
循环依赖遇上AOP

总结

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

画图不容易啊,麻烦各位大佬给个赞!有不懂的问题可以留言,会一一解答,有写错的地方也欢迎探讨!
在这里插入图片描述在这里插入图片描述在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/192197.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 数据结构之哈希表(HASH)

    前言   当我们在编程过程中,往往需要对线性表进行查找操作。在顺序表中查找时,需要从表头开始,依次遍历比较a[i]与key的值是否相等,直到相等才返回索引i;在有序表中查找时,我们经常使用的是二分查找,通过比较key与a[i]的大小来折半查找,直到相等时才返回索引i。最终通过索引找到我们要找的元素。   但是,这两种方法的效率都依赖于查找中比较的次数。我们有一种想法,能不能不经过比较,而是

    2022年4月1日
    80
  • 微信小程序推送模板消息功能_小程序推送消息设置

    微信小程序推送模板消息功能_小程序推送消息设置今天KingYiFan给大家分享一下小程序模板消息推送:根据微信小程序最新机制:2019年10月份微信发布了最新模板消息整改公告,由模板消息更改为订阅消息,模板消息将于2020年1月10日下线,下线后这篇文章将失效。最新微信订阅消息文章已发布,请大家移步:https://blog.csdn.net/weixin_39984161/article/details/103888343公告如下:…

    2022年9月1日
    4
  • html设置ie9兼容性视图,ie9浏览器设置兼容性视图在哪里设置「建议收藏」

    html设置ie9兼容性视图,ie9浏览器设置兼容性视图在哪里设置「建议收藏」当您在使用IE9打开为早期IE版本所设计的网页时,可能会无法正常浏览。此时您可以尝试一下IE的兼容性视图功能来解决这个问题。下面由学习啦小编为你整理了ie9浏览器设置兼容性视图在哪里设置的相关方法,希望对你有帮助!ie9设置兼容性视图的方法和步骤如下该方法同样适用于Windows8中的IE10浏览器版本。当我们在IE9中浏览到显示不正常的网站时,我们可以点击如下图中的兼容性视图的图标,然后我们…

    2025年10月7日
    2
  • [乐意黎原创] 美女发帖求嫁有钱人 金融家精彩回应[通俗易懂]

    [乐意黎原创] 美女发帖求嫁有钱人 金融家精彩回应

    2022年1月31日
    39
  • er图的表示方法_立体图形简笔画

    er图的表示方法_立体图形简笔画本文章和大家分享如何画ER图,因为在计算机毕业设计、课程设计、文档报告中经常用到,所以还是有必要和大家共同来学习一下。一、先看图熟悉E-R图中图形及代表的意思在我们毕业论文、课题报告等文档中,涉及到画E-R图(实体-联系图)是非常常见的。如上图所示,我将详细为大家介绍E-R图中每个图形的含义及用法,在我们针对自己的系统如何画E-R图,这才是至关重要的!长方形:表示实体。什么是实体?实体是客观存在的事物。例如用户、商品、订单、供应商等。说直白点!!!你数据库的表名就可以做一个实体对象。一个系统.

    2022年9月22日
    5
  • vdbench数据校验翻译

    vdbench数据校验翻译本文翻译自vdbench的使用手册中的数据校验章节,如有纰漏,还请不吝赐教。vdbench源码下载地址:https://www.oracle.com/downloads/server-storage/vdbench-source-downloads.html数据校验在性能测试的时候不应该被使用,处理器开销可能影响性能测试的结果。在我开始之前,我想问一个想了很多次的问题:“为什么我使用vdbench去检查数据冲突?我也可以写一个大文件,计算校验和,然后重新读这个文件并比较校验和。”当然,你可.

    2022年5月12日
    52

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号