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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 《Android应用开发揭秘》连载2

    《Android应用开发揭秘》连载2《Android应用开发揭秘》  书名:Android应用开发揭秘作者:杨丰盛出版社:机械工业出版社ISBN:9787111291954出版日期:2010年3月(1版2次)开本:16页码:515版次:1-2定价:69元豆瓣网讨论地址:http://www.douban.com/subject/4200822/China-pub预订地址:http://www.china-pub.

    2022年6月11日
    39
  • 【python】hasattr( )的用法

    【python】hasattr( )的用法hasattr()函数用于判断对象是否包含对应的属性。hasattr(object,name)object–对象。name–字符串,属性名。return如果对象有该属性返回True,否则返回False。实例classvariable:x=1y=’a’z=Truedd=variable()print(hasa…

    2022年10月22日
    0
  • 2021DIY电脑配置入门篇(包含各cpu显卡天梯图对比)

    2021DIY电脑配置入门篇(包含各cpu显卡天梯图对比)前言:我本来以为一篇文章可以把电脑配置讲清楚的,但是发现电脑比我想象的要复杂,所以可能分了几篇来写如何查看自己的电脑配置最简单的右键桌面此电脑->点击属性下载个电脑管家等电脑助手软件也可以查看详细配置如何DIY自己的第一台电脑篇幅有限,这里我只详细分析一台电脑的核心配置(CPU、主板、显卡),外加内存定好预算对于电脑来说,预算是最重要的!没有预算,一切都是空谈。没预算默认外星人Area51M(价格在2万左右),现在电脑往往充当一种娱乐需求,相对来说比较次要,因此大多数人配电脑.

    2022年7月12日
    28
  • vps怎么传文件_服务器搭建vps

    vps怎么传文件_服务器搭建vpsvps搭建文件服务器内容精选换一换方法一:在VSCode上选择“文件>首选项>设置”,再选择“工作区”,并在输入框搜索“kunpeng.remote.ssh.machineinfo”,单击“在settings.json中编辑”后生成settings.json文件。如图1所示。生成settings.json文件方法二:在VSCode上选择“资源管理器”,找到“.vs例如main…

    2022年10月23日
    0
  • SpringBoot2.0 Actuator 监控参数说明

    SpringBoot2.0 Actuator 监控参数说明基于SpringBoot2.0+Actuatormetrics的监控(基于OracleJDK9,G1)引言SpringBoot2在spring-boot-actuator中引入了micrometer,对1.x的metrics进行了重构,另外支持对接的监控系统也更加丰富(Atlas、Datadog、Ganglia、Graphite、Influx、JMX、NewRelic、Prometheus、SignalFx、StatsD、Wavefront)。本文以Prometheus为例阐述SpringBo

    2022年5月9日
    45
  • SCSA—信息安全概述

    SCSA—信息安全概述数字化时代威胁升级:攻击频发、传统安全防护逐渐失效、安全风险能见度低、缺乏自动化防御手段一、信息安全概述:1)信息安全:防止任何对数据进行未授权访问的措施,或者防止造成信息有意无意泄漏、破坏、丢失等问题的发生,让数据处于远离危险、免于威胁的状态或特性2)网络安全:计算机网络环境下的信息安全二、信息安全的脆弱性及常见安全攻击1.网络的开放性:互联网的美妙之处在于你与每一个相连,它的可怕之处在于每一个人与你相连2.协议栈的脆弱性及常见攻击1)协议栈的自身脆弱性:缺乏数据源验证机制、缺乏机密性保障机

    2022年6月20日
    30

发表回复

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

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