spring AOP 原理

news2024/11/16 6:03:13

图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://www.coloradmin.cn/o/181356.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

#C. 笨友圈

题目思路1直接模拟题意,相当于邻接矩阵,用bool类型的二维数组vis[i][j]来存储i和j是否为好友,交叉点为1代表是好友,为0代表不是;a[i]存储i这个人看到的信息数量。然后输入后如果符号代表要将u,v加个好友,就将vis[u][v] 1和vis[v][u] 1,如果是拉黑就将vis[u][v] 0和vis[v][u]…

ATAC-seq分析:差异分析(10)

在下部分中,我们将研究如何使用 R/Bioconductor 识别开放区域中的变化。 在这里,我们将采用类似于 Diffbind 中的方法,并在 ATACseq 分析中合理建立。 1. 识别非冗余峰 首先,我们将定义至少 2 个样本中存在的一组非冗余峰&#xf…

ffmpeg为mkv封装格式的音视频文件添加字幕

现在好莱坞的电影,都是全球看,一个地区的人看电影时,电影屏幕上应该展示对应的本地区语言字幕。故电影画面在不同的地区,需要配置不同的语言字幕。故视频画面里面的字幕应该可以拆出来,不能像老版三国演义,…

ZYNQ IP核之RAM

随机存取存储器(Random Access Memory,RAM),可以随时把数据写入任一指定地址的存储单元,也可以随时从任一指定地址中读出数据,其读写速度是由时钟频率决定的,主要用来存放程序及程序执行过程中产…

C++结构(OOP的基石)

写在前面 面向初学者撰写专栏,个人原创的学习C/C笔记(干货)所作源代码输出内容为中文,便于理解如有错误之处请各位读者指正请读者评论回复、参与投票,反馈给作者,我会获得持续更新笔记干货的动力。致粉丝&a…

vulnhub之VENOM:1

1.信息收集 输入arp-scan 192.168.239.0/24探测存活的IP 使用nmap对192.168.239.166进行扫描,发现IP端口21、80、139、443、445。 在浏览器上访问http://192.168.239.166/,查看源码发现类似md5加密。 解密md5可以得到为hostinger。 输入enum4linux …

Linux | 软件包管理器——yum的使用

文章目录一、什么是软件包二、有关软件使用的背景讲解1、如何去下一个软件呢?过程是怎样的?2、软件的商业利益分析3、Linux开源社区的生态链4、Linux中软件的分类和选择三、yum的使用1、说在前面【注意事项】2、如何查看软件包3、软件的安装和卸载四、yu…

WPF鼠标、键盘、拖拽事件、用行为封装事件

WPF鼠标、键盘、拖拽事件、用行为封装事件 本文主要介绍了WPF中常用的鼠标事件、键盘事件以及注意事项,同时使用一个案例讲解了拓展事件。除此之外,本文还讲述如何用行为(Behavior)来封装事件。 Windows中的事件通过消息机制来完…

新手利用Git上传项目代码到Gitee仓库

【本文发布于https://blog.csdn.net/Stack_/article/details/128770678,未经许可禁止转载,转载须注明出处】 一、安装git工具 【git下载】 【git插件以及插件汉化包下载】 官网下载很慢,已上传CSDN。跳转 或者百度云 链接:https:…

下拉列表支持多选

<!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>下拉列表支持多选</title> </head> <body bgcolor"antiquewhite"> <center> <…

【算法基础】二分查找算法

一、二分查找算法原理 1. 算法介绍 首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后…

github codespace进行npm start运行开发服的时候无法显示页面(白屏)

github codespace进行npm start运行开发服的时候无法显示页面解决方案 先说答案 必须要指定host为0.0.0.0&#xff0c;因为一般前端开发的时候都是本地访问的&#xff0c;所以npm start 默认启动一个开发服&#xff0c;监听127.0.0.1的请求&#xff0c;也就是localhost。但是…

《Spring揭秘》读书笔记 3:Spring MVC

22 迈向Spring MVC的旅程 【参考】Java Web开发历程。 1) Servlet独行天下的时代。 一个Servlet对应处理一个Web请求。Servlet什么都做。 2) 繁盛一时的JSP时代。 将Servlet中的视图渲染逻辑以独立的单元抽取出来&#xff0c;JSP成为Java Web应用程序事实上的模板化视图标准…

Golang 使用Gin创建Restful API

Golang 使用Gin创建Restful API 今天学习下Go语言如何集成Gin框架编写Restful Web API的基本操作。Gin框架简化了Go原生语言构建Web应用程序的复杂度&#xff0c;在今天的学习中&#xff0c;将学会使用Gin构建路由请求、数据检索、JSON响应封装等最简单的Web服务。 基本要求 …

将本地txt文件上传至mysql

文章目录单个文件导入1.创建数据库和数据表2.使用cmd各种情况说明如果报错方案一方案二方案三mysql重启命令重启&#xff1a;图形页面重启当txt文件中的数据量太多时&#xff0c;不再适合用sql语句插入&#xff0c;这里介绍讲本地txt文件导入到mysql中 单个文件导入 如图所示…

【Maven】私服

目录 1. 私服介绍 问题导入 1.1 介绍 1.2 Nexus安装与启动 1.3 私服资源操作流程分析 2. 私服仓库分类 问题导入 3. 资源上传与下载 问题导入 3.1 从私服中下载依赖 3.2 上传依赖到私服中 1. 私服介绍 问题导入 这里的私服和平时我们听的国服、体验服、欧服等等有…

《深入浅出计算机组成原理》学习笔记 Day12

数据通路&#xff08;上&#xff09;1. 指令周期&#xff08;Instruction Cycle&#xff09;2. 建立数据通路3. CPU 所需要的硬件电路4. 总结参考1. 指令周期&#xff08;Instruction Cycle&#xff09; 计算机每执行一条指令的过程&#xff0c;可以分为这几个步骤&#xff1a…

MySQL三大日志

MySQL三大日志包括&#xff1a;undolog&#xff0c;redo log&#xff0c;binlog&#xff0c;它们分别有以下作用&#xff1a; undolog&#xff1a;是Innodb存储引擎生成的日志。用于事务的回滚和MVCC&#xff0c;保证了事务的原子性。 redo log&#xff1a;是Innodb存储引擎生…

【汇编】深入浅出地讲解使用六条汇编指令解决大部分汇编代码

开发环境说明 本文采用的IDE为keil5&#xff0c;核心板为STM32F103ZE。 在keil中添加以下两条语句即可生成汇编代码&#xff1a; 在上图界面中添加下述两句代码即可生成汇编代码&#xff1a;fromelf --bin --outputtest.bin Objects\test.axffromelf --text -a -c --outputtest…

使用Facebook分析跟踪SEO进展

Facebook是一个强大的社交平台&#xff0c;在这里你可以获取关于你的业务或客户的各种信息。它为你提供了一个巨大的渠道来展示你在过去一年中对行业或公司做出的贡献&#xff0c;以及你如何改进和优化我们所做的事情。如果不知道如何利用 Facebook来获得更多关于 SEO工作的信息…