【Spring源码--AOP的实现】--综述

2024-08-31 11:48

本文主要是介绍【Spring源码--AOP的实现】--综述,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言:
相比于IOC的源码,AOP的源码更为抽象一点。因为我们在读IOC源码,可以根据我们的Bean配置,去相结合着思考和理解,而AOP的是一个切面的概念,所生成的代理对象也不是我们说看到就看到的,相对抽象一点,但是AOP的源码相对于IOC的源码少了很多。所以我们在读AOP源码的时候,应该先把整个流程快速的读通,再去一点点具体到方法,再者就是自己动手写demo。那么,本文作为AOP的综述,主要写一些基本概念及AOP的整体设计流程。
AOP的基本概念
  1. Advice:通知,定义在指定连接点上做什么内容。是AOP联盟定义的一个接口,SpringAOP在实现中提供了更多的具体通知类型,如BeforeAdvice、AfterAdvice、ThrowsAdvice等。
  2. Pointcut:切点,符合切点表达式的连接点,也就是被真正切入的地方。
  3. Aspect:切面,切入系统的一个切面,比如事物管理是一个切面,权限管理是一个切面。
  4. Join point:连接点,进行横向切入的位置。
AOP的理解:
Spring AOP是基于JDK动态代理和CGLIB(动态字节码增强技术)实现的,在方法执行的前后进行拦截。
对于AOP的理解,可以引用网友的一段话:
aop切面编程就是在常规的执行java类中方法前或执行后加入自定义的方法。比如你本来每天都去打酱油,去,打酱油,回。现在我每天在你打酱油路上等着,你去打酱油的时候我打你一顿,回来的时候给你点糖果吃。你根本不知道为什么我会在路上拦住打你。所以在切面中插入你自定义的方法,这个方法的执行和本身要执行的类方法无关系,也就是不是这个类的方法来调用你写的方法的,你写的方法什么时候执行都是要通过在配置指定。我打完你,你该打酱油还是去打酱油,当然我如果是拦住你让你酱油打少点,你打酱油的时候还是会打那么多,但是在你打完酱油回来的时候我可以把你的酱油倒些出去,所以嵌入的自定义方法对要调用的类方法本身没有影响,但是可以操纵这个方法的返结果或者处理结果。
AOP的设计分析:
虽然对于我们使用者来说,只需要进行简单的配置即可使用SpringAOP,但仔细分析其内部实现可以看到,这里面还是有挺复杂的一个过程。如图所示:
上面这个图大概解释了aop的一个实现过程,具体的细节还是有很多的,这里只是给大家理解一个整体流程。具体我们后面会分析代码,也就是按照这个顺序。

AOP的配置方式:
一般可以有以下几种方式,其中<aop:config>用的最多,AspectJ的注解用的也还好,ProxyFactoryBean就相对麻烦点,不过是最基本的,最好理解AOP原理的,根据项目不同进行选择。
  • 配置ProxyFactoryBean,显式地设置advisors, advice, target等
  • 通过<aop:config>来配置
  • 通过<aop:aspectj-autoproxy>来配置,使用AspectJ的注解来标识通知及切入点
AOP的应用场景:
应用场景体现在两个方面:一是应用可以直接使用AOP的功能,设计应用的横切关注点,把扩约应用程序多个模块的功能抽象出来,并通过简单的AOP的使用,灵活的编制到模块中,比如:日志记录的功能。另一方面,在Spring内部,一些支持模块也是利用Spring AOP来实现的,如:事务处理。根据网上的网友总结,大概可以用用到一下几个方面:
  • Authentication 权限
  • Caching 缓存
  • Context passing 内容传递
  • Error handling 错误处理
  • Lazy loading 懒加载
  • Debugging  调试
  • logging, tracing, profiling and monitoring 记录跟踪 优化 校准
  • Performance optimization 性能优化
  • Persistence  持久化
  • Resource pooling 资源池
  • Synchronization 同步
  • Transactions 事务

关于SpringAOP综述,大概就介绍这些内容,后续我会跟着上面的流程图,先以ProxyFactoryBean的配置为例,进行源码的走读。后面再去了解下<aop:config>这样的配置是如何实现的AOP。题外话:最近手头有项目了,可能博客内容更新会稍微慢点!

这篇关于【Spring源码--AOP的实现】--综述的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1123818

相关文章

Java调用Python代码的几种方法小结

《Java调用Python代码的几种方法小结》Python语言有丰富的系统管理、数据处理、统计类软件包,因此从java应用中调用Python代码的需求很常见、实用,本文介绍几种方法从java调用Pyt... 目录引言Java core使用ProcessBuilder使用Java脚本引擎总结引言python

SpringBoot操作spark处理hdfs文件的操作方法

《SpringBoot操作spark处理hdfs文件的操作方法》本文介绍了如何使用SpringBoot操作Spark处理HDFS文件,包括导入依赖、配置Spark信息、编写Controller和Ser... 目录SpringBoot操作spark处理hdfs文件1、导入依赖2、配置spark信息3、cont

springboot整合 xxl-job及使用步骤

《springboot整合xxl-job及使用步骤》XXL-JOB是一个分布式任务调度平台,用于解决分布式系统中的任务调度和管理问题,文章详细介绍了XXL-JOB的架构,包括调度中心、执行器和Web... 目录一、xxl-job是什么二、使用步骤1. 下载并运行管理端代码2. 访问管理页面,确认是否启动成功

Java中的密码加密方式

《Java中的密码加密方式》文章介绍了Java中使用MD5算法对密码进行加密的方法,以及如何通过加盐和多重加密来提高密码的安全性,MD5是一种不可逆的哈希算法,适合用于存储密码,因为其输出的摘要长度固... 目录Java的密码加密方式密码加密一般的应用方式是总结Java的密码加密方式密码加密【这里采用的

Java中ArrayList的8种浅拷贝方式示例代码

《Java中ArrayList的8种浅拷贝方式示例代码》:本文主要介绍Java中ArrayList的8种浅拷贝方式的相关资料,讲解了Java中ArrayList的浅拷贝概念,并详细分享了八种实现浅... 目录引言什么是浅拷贝?ArrayList 浅拷贝的重要性方法一:使用构造函数方法二:使用 addAll(

解决mybatis-plus-boot-starter与mybatis-spring-boot-starter的错误问题

《解决mybatis-plus-boot-starter与mybatis-spring-boot-starter的错误问题》本文主要讲述了在使用MyBatis和MyBatis-Plus时遇到的绑定异常... 目录myBATis-plus-boot-starpythonter与mybatis-spring-b

Java中switch-case结构的使用方法举例详解

《Java中switch-case结构的使用方法举例详解》:本文主要介绍Java中switch-case结构使用的相关资料,switch-case结构是Java中处理多个分支条件的一种有效方式,它... 目录前言一、switch-case结构的基本语法二、使用示例三、注意事项四、总结前言对于Java初学者

关于Java内存访问重排序的研究

《关于Java内存访问重排序的研究》文章主要介绍了重排序现象及其在多线程编程中的影响,包括内存可见性问题和Java内存模型中对重排序的规则... 目录什么是重排序重排序图解重排序实验as-if-serial语义内存访问重排序与内存可见性内存访问重排序与Java内存模型重排序示意表内存屏障内存屏障示意表Int

Python pyinstaller实现图形化打包工具

《Pythonpyinstaller实现图形化打包工具》:本文主要介绍一个使用PythonPYQT5制作的关于pyinstaller打包工具,代替传统的cmd黑窗口模式打包页面,实现更快捷方便的... 目录1.简介2.运行效果3.相关源码1.简介一个使用python PYQT5制作的关于pyinstall

使用Python实现大文件切片上传及断点续传的方法

《使用Python实现大文件切片上传及断点续传的方法》本文介绍了使用Python实现大文件切片上传及断点续传的方法,包括功能模块划分(获取上传文件接口状态、临时文件夹状态信息、切片上传、切片合并)、整... 目录概要整体架构流程技术细节获取上传文件状态接口获取临时文件夹状态信息接口切片上传功能文件合并功能小