spring AOP 原理

article/2025/9/18 10:18:51

图1

一、spring注册 AnnotationAwareAspectJAutoProxyCreator

  1. 通过@EnableAspectJAutoProxy可以看到先把AspectJAutoProxyRegistrar通过@Import注册到spring。

  2. AspectJAutoProxyRegistrar实现了ImportBeanDefinitionRegistrar接口,所以就有了将某个bean引入spring 的能力。再接下来的运行中会把 AnnotationAwareAspectJAutoProxyCreator.class 以beanName为org.springframework.aop.config.internalAutoProxyCreator注册到spring中。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-p31z2bQz-1674821484013)(/Users/liuyanfei/work/idea20182/workspace/mywork/lyf-iron-man-component/iron-man-springbase/iron-man-spring1/src/md/3.aop原理/image-20230127191959587.png)]

二、 AnnotationAwareAspectJAutoProxyCreator分析

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-txKR033p-1674821484013)(/Users/liuyanfei/work/idea20182/workspace/mywork/lyf-iron-man-component/iron-man-springbase/iron-man-spring1/src/md/3.aop原理/image-20230127193327946.png)]

  1. 通过查看 AnnotationAwareAspectJAutoProxyCreator的类继承图可以清楚的看到实现了 BeanPostProcessor接口,所以AnnotationAwareAspectJAutoProxyCreator注册到spring以后成为了spring 的 BeanPostProcessor后置处理器。
  2. BeanPostProcessor 接口 的postProcessBeforeInstantiation()、postProcessAfterInitialization(),在 AbstractAutoProxyCreator中已经得到了实现。(后面拿代理对象的时候就是在AbstractAutoProxyCreator.postProcessAfterInitialization())中去处理的。

三、获取代理对象

  1. 由图1可知,在bean init 初始化的时候会前后调用 后置处理器的postProcessBeforeInstantiation()、postProcessAfterInitialization()。代码如下

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-M0pBLoOw-1674821484014)(/Users/liuyanfei/work/idea20182/workspace/mywork/lyf-iron-man-component/iron-man-springbase/iron-man-spring1/src/md/3.aop原理/image-20230127195251942.png)]

  2. 当前Bean在获取代理对象主要是在 postProcessAfterInitialization() 方法中去获取的。Bean在获取代理对象时会判断当前的bean是否实现了接口

    • 如果实现了接口,那么就使用jdk 的动态代理来生成bean 的代理对象
    • 如果没有实现接口,那么就使用Cglib 来生成当前bean 的代理对象(因为jdk 动态代理的对象必须是实现了接口的bean)
  3. 即使没有做切片的Bean 也会调用这个postProcessAfterInitialization() ,但是会验证当前Bean有没有切片,没有切片的话就不会被代理了。

四、代理链(以JDK动态代理对象为例)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Q8m0Up0b-1674821484014)(/Users/liuyanfei/work/idea20182/workspace/mywork/lyf-iron-man-component/iron-man-springbase/iron-man-spring1/src/md/3.aop原理/5.aop实现原理下--代理过程.png)]

  1. 用jdk 的动态代理代理Bean,那么被代理的bean在执行任何方法的时候就会进入到 JdkDynamicAopProxyinvoke()方法。

  2. invoke()方法的调用链如上。这个调用链实际上是使用 责任链模式来做的,调用是环环相扣的,上图为了简化有失准确。具体的逻辑见下图

在这里插入图片描述


http://chatgpt.dhexx.cn/article/5yrwXCUx.shtml

相关文章

Spring的AOP实现原理

本学习笔记将尽可能的将AOP的知识讲解的通俗易懂,先从一个典型的问题出发,引入AOP这个概念,介绍AOP的基本概念,再到Spring中的AOP的实现方案,最后进行一个简单的总结归纳。本学习笔记中不考虑cglib、也不会太关注Sprin…

spring的AOP和IOC的原理

目录 一、spring的ioc与aop原理 二、代理模式: 三、静态代理 四、动态代理 五、实际的操作 六、动态代理的实现: 七、什么是AOP 八、主流的AOP框架: 九、术语: 十、通知的五种类型: 十一、AOP的优点&#x…

spring aop原理

🍅 Java学习路线:搬砖工逆袭Java架构师 🍅 简介:Java领域优质创作者🏆、CSDN哪吒公众号作者✌ 、Java架构师奋斗者💪 🍅 扫描主页左侧二维码,加入群聊,一起学习、一起进步…

AOP原理

AOP原理 什么是AopAOP的作用AOP的基本概念AOP使用场景AOP原理如何动态修改功能AOP的编程思想AOP面向切面编程操作AOP通知执行的顺序代码执行流程准备工作源码揭开面纱 什么是Aop AOP(Aspect Orient Programming)也就是面向切面编程,作为面向对…

无法显示页面,因为发生内部服务器错误。

用iis添加网站后,访问域名,显示“无法显示页面,因为发生内部服务器错误。” 之前我将这些文件放在一个Demo文件夹中,把Demo放在test站点下,通过域名访问Demo报错。 我将Demo下的文件直接放在test下,访问成…

遇到“服务器内部错误http500怎么办?

出现500错误的原因是很多的,一般来说都是程序错误导致的,如果程序出错,那么在浏览器内会返回给用户一个友好的错误提示,统一称之为服务器500错误。 解决的方法就是您必须在http中能够正确的获得错误信息,方法为&#x…

500 - 内部服务器错误--解决方案

一般网上的方法是这样的: 一、打开 Internet 信息服务(IIS)管理器。点击出错的站点,并双击右边的ASP图标,如下图所示: 二、展开右侧配置中的“调试属性”,把“将错误发送到浏览器”的值设为 "true"&#xf…

HTTP状态 500 - 内部服务器错误 类型 异常报告,初学servlet遇到的问题

写给自己看,初学记录一下,maven项目中tomcat,Servlet遇到的问题 HTTP状态 500 - 内部服务器错误 类型 异常报告,初学servlet遇到的问题 类似这种报错,在hello world级别的servlet中碰到。 报错分析 大概是说自定义java类在实例…

IIS 配置网站出现500内部服务器错误,显示具体错误信息

1、打开IIS 找到如下图的部分,双击点开 2、点开之后找到如下图部分,点击 3、选择如下图部分,然后点击确定。 4、这个时候页面会出现详细的错误,如果没有出现详细错误,配置如下图部分,不勾选。 5、这时会出现…

Nextcloud 内部服务器错误解决

在部署nextcloud过程中最后登录页面时出现内部服务器错误,心态当时就炸了。 在网上找了各种方案,但是大部分博主都告诉我是/var/lib/php/session/属组的权限问题,或者web目录的权限不对。但是对我这个问题没有用。 我把他们的方案贴出来对你…

IDEA中HTTP500 - 内部服务器错误类型 在 [] 行处理 [/.jsp] 时发生异常情况;java.lang.NoSuchMethodError: com.Bean.Person.setId

问题: HTTP状态 500 - 内部服务器错误 类型 异常报告 消息 在 [65] 行处理 [/pages/el 5/elDataDemo2.jsp] 时发生异常 描述 服务器遇到一个意外的情况,阻止它完成请求。 例外情况 org.apache.jasper.JasperException: 在 [65] 行处理 [/pages/el 5/elDa…

HTTP状态 500 - 内部服务器错误:No converter found for return value of type: class xxx(简单分析及解决)

问题描述 以下内容基于ssm框架,当我们向tomcat服务器发起请求时,出现如下的错误状态提示–500。 Tomcat日志信息: 原因分析: 未找到类型返回值的转换器:类 com.ssm.utils.Msg,使用jackson绑定数据时出现…

阿里云服务器出错500 - 内部服务器错误

阿里云服务器部署并发布成功后,访问该网页时出错,报 500 - 内部服务器错误。 原因:1.http 500内部服务器错误说明IIS服务器无法解析ASP代码,如果你联网还发现找不到服务器就是500错误了. 2.在安装Framework v4.0之后&#xff0c…

HTTP 500 - Internal Server Error 服务器内部错误

php出现如下错误 原因是出现了中文字符 修改后,页面成功访问

500错误及服务器内部错误

500错误及服务器请求错误 一、简言:500错误代表着你请求的后端或者说服务器端出现了错误。 可能的原因非常多,因为很多程序内部都会把代码运行出现的错误捕捉然后直接返回一个“服务器内部错误500”,这也就导致了我们在前端发送请求时见到的…

远程服务器返回错误: (500) 内部服务器错误解决办法

在.net中发送 xml post请求和接受xml 的post请求时,经常会遇到“远程服务器返回错误: (500) 内部服务器错误”。 这里有2种解决办法: 第一种方法:修改请求端Content-Type 为“text/xml”(httpclient.Headers.Add("Content-Type",…

服务器错误500-内部服务器错误。您查找的资源存在问题,因而无法显示。

当我们用iis环境搭建的网站出现了服务器错误500错误时我们该怎么处理呢,小编的网站织梦网站就出现了服务器错误 500 - 内部服务器错误。 您查找的资源存在问题,因而无法显示这个问题,如下图所示。织梦网站后台登陆前台预览都是正常的&#x…

什么是HTTP 500内部服务器错误,要怎么修复

HTTP 500是一种原始的错误代码,它指示网站服务器在处理请求时发生了内部错误,不过具体错误原因是不确定的。一般情况下,这种错误通常是由服务器程序上的bug或者配置问题造成的。当服务器收到请求时,尝试执行它时,但是发…

HTTP状态500-内部服务器错误

SSM整合时出现的问题 起初关注点一直在Mapper.xml上,CSDN查询解决方法大致在这样几种。 1.SQL语句问题 2.resultType返回类型问题(List集合中的参数类型) 3.database.properties数据库配置文件问题(Mysql8以上加时区,文…

Java问题解决:HTTP状态 500 - 内部服务器错误 Servlet[SpringMVC]的Servlet.init()引发异常

问题: 在学习11_尚硅谷_SpringMVC_HelloWorld 课程中部署SpringMVC项目时遇到如下问题: HTTP状态 500 - 内部服务器错误 类型 异常报告消息 Servlet[SpringMVC]的Servlet.init()引发异常描述 服务器遇到一个意外的情况&#xff0…