【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

相关文章

Python位移操作和位运算的实现示例

《Python位移操作和位运算的实现示例》本文主要介绍了Python位移操作和位运算的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1. 位移操作1.1 左移操作 (<<)1.2 右移操作 (>>)注意事项:2. 位运算2.1

如何在 Spring Boot 中实现 FreeMarker 模板

《如何在SpringBoot中实现FreeMarker模板》FreeMarker是一种功能强大、轻量级的模板引擎,用于在Java应用中生成动态文本输出(如HTML、XML、邮件内容等),本文... 目录什么是 FreeMarker 模板?在 Spring Boot 中实现 FreeMarker 模板1. 环

Qt实现网络数据解析的方法总结

《Qt实现网络数据解析的方法总结》在Qt中解析网络数据通常涉及接收原始字节流,并将其转换为有意义的应用层数据,这篇文章为大家介绍了详细步骤和示例,感兴趣的小伙伴可以了解下... 目录1. 网络数据接收2. 缓冲区管理(处理粘包/拆包)3. 常见数据格式解析3.1 jsON解析3.2 XML解析3.3 自定义

SpringMVC 通过ajax 前后端数据交互的实现方法

《SpringMVC通过ajax前后端数据交互的实现方法》:本文主要介绍SpringMVC通过ajax前后端数据交互的实现方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价... 在前端的开发过程中,经常在html页面通过AJAX进行前后端数据的交互,SpringMVC的controll

Java中的工具类命名方法

《Java中的工具类命名方法》:本文主要介绍Java中的工具类究竟如何命名,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录Java中的工具类究竟如何命名?先来几个例子几种命名方式的比较到底如何命名 ?总结Java中的工具类究竟如何命名?先来几个例子JD

Java Stream流使用案例深入详解

《JavaStream流使用案例深入详解》:本文主要介绍JavaStream流使用案例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录前言1. Lambda1.1 语法1.2 没参数只有一条语句或者多条语句1.3 一个参数只有一条语句或者多

Spring Security自定义身份认证的实现方法

《SpringSecurity自定义身份认证的实现方法》:本文主要介绍SpringSecurity自定义身份认证的实现方法,下面对SpringSecurity的这三种自定义身份认证进行详细讲解,... 目录1.内存身份认证(1)创建配置类(2)验证内存身份认证2.JDBC身份认证(1)数据准备 (2)配置依

利用python实现对excel文件进行加密

《利用python实现对excel文件进行加密》由于文件内容的私密性,需要对Excel文件进行加密,保护文件以免给第三方看到,本文将以Python语言为例,和大家讲讲如何对Excel文件进行加密,感兴... 目录前言方法一:使用pywin32库(仅限Windows)方法二:使用msoffcrypto-too

SpringBoot整合OpenFeign的完整指南

《SpringBoot整合OpenFeign的完整指南》OpenFeign是由Netflix开发的一个声明式Web服务客户端,它使得编写HTTP客户端变得更加简单,本文为大家介绍了SpringBoot... 目录什么是OpenFeign环境准备创建 Spring Boot 项目添加依赖启用 OpenFeig

Java Spring 中 @PostConstruct 注解使用原理及常见场景

《JavaSpring中@PostConstruct注解使用原理及常见场景》在JavaSpring中,@PostConstruct注解是一个非常实用的功能,它允许开发者在Spring容器完全初... 目录一、@PostConstruct 注解概述二、@PostConstruct 注解的基本使用2.1 基本代