首页 > 其他分享 >spring--AOP的实现原理

spring--AOP的实现原理

时间:2024-01-20 19:55:06浏览次数:21  
标签:-- spring AOP 代理 切点 对象 通知 Spring

Spring AOP(面向切面编程)是 Spring 框架的一个关键组成部分,它提供了一种将横切关注点(如日志记录、事务管理、安全等)与业务逻辑分离的方法。Spring AOP 的实现主要依赖于代理模式,以下是其工作原理的简要概述:

  1. 代理模式:

    • Spring AOP 通过创建目标对象的代理来应用横切逻辑。这些代理在目标方法执行前后包围目标方法调用,以此来实现横切关注点的织入。
  2. 代理的创建:

    • JDK 动态代理:如果目标对象实现了接口,Spring AOP 默认使用 JDK 动态代理。这种方式不需要额外的库,它通过反射机制在运行时创建一个实现了目标对象接口的代理对象。
    • CGLIB 代理:如果目标对象没有实现接口,或者显式配置使用 CGLIB,Spring AOP 会使用 CGLIB 库生成目标类的子类作为代理。
  3. AOP 概念:

    • 切面(Aspect):模块化横切关注点的类,它包含了通知和切点的定义。
    • 连接点(Join Point):在程序执行过程中插入横切关注点的点,如方法调用或字段赋值操作。
    • 通知(Advice):在切面的某个特定的连接点上执行的动作,包括前置通知(Before)、后置通知(After)、返回通知(After-returning)、异常通知(After-throwing)和环绕通知(Around)。
    • 切点(Pointcut):用于匹配连接点(如特定方法)的表达式,决定在哪些连接点应用通知。
    • 目标对象(Target Object):被一个或多个切面所通知的对象。
    • 织入(Weaving):将切面与其他应用类型或对象连接起来,创建一个被通知的对象的过程。
  4. AOP 的工作流程:

    • 当应用启动时,Spring 容器会读取配置中的切面和规则,并为匹配的目标对象创建代理。
    • 当调用目标对象的方法时,实际上是调用了代理对象的相应方法。
    • 代理对象根据切点的定义确定是否需要执行相关的通知。
    • 如果需要,代理会在调用目标方法之前或之后(或者两者都)执行织入的通知逻辑。
    • 最终,代理会执行目标方法本身的逻辑。
  5. 使用 AspectJ 表达式语言:

    • Spring AOP 使用 AspectJ 提供的切点表达式语言来定义切点。AspectJ 是 Java 社区中一个强大的 AOP 框架,Spring AOP 支持它的表达式语言,但不支持所有的 AspectJ 功能。

Spring AOP 是基于代理的 AOP 实现,它在运行时为对象创建代理,并通过代理实现横切关注点的织入。这种方式使得 AOP 在 Spring 中易于使用和集成,但也意味着 Spring AOP 只在代理对象的方法调用时才能应用通知,而不能像 AspectJ 那样在任何连接点上都能织入通知。

标签:--,spring,AOP,代理,切点,对象,通知,Spring
From: https://www.cnblogs.com/xylfjk/p/17977048

相关文章

  • P1597 语句解析
    题目链接:该题的读入方式值得学习:连续读入若干条相同格式的语句,可以考虑\(\sfwhile...scanf...!=EOF\)的形式。由于赋值语句可能是将变量赋值给变量或者将值赋给变量,因此在这里需要对\(\rms_2\)是否是数字作讨论。#include<cstdio>chars1,s2;inta[3];intmain(){......
  • 1.20每日总结
    Python3数字(Number)Python数字数据类型用于存储数值。数据类型是不允许改变的,这就意味着如果改变数字数据类型的值,将重新分配内存空间。以下实例在变量赋值时Number对象将被创建:var1=1var2=10您也可以使用del语句删除一些数字对象的引用。del语句的语法是:delva......
  • kafka入门(九):kafka分区分配策略
    kafka分区分配策略参数:Kafka提供了消费者客户端参数partition.assignment.strategy来设置消费者与订阅主题之间的分区分配策略。默认情况下,此参数的值为org.apache.kafka.clients.consumer.RangeAssignor,即采用RangeAssignor分配策略。除此之外,Kafka还提供了另外两种分配策略:R......
  • 一站式图片管理
    一、引言随着智能手机、社交媒体和网络技术的快速发展,人们在生活中产生了越来越多的图片。据统计,到2025年,全球图片市场规模将达到6000亿美元。面对如此庞大的数据量,如何进行高效、便捷的图片管理成为了一个亟待解决的问题。本文将详细介绍一站式图片管理方案,帮助用户轻松应对......
  • 第九天:软件编译安装过程
    一、利用编译工具,通常只需要三个大的步骤./configure(1)通过选项传递参数,指定安装路径、启用特性等;执行时会参考用户的指定以及Makefile.in文件生成Makefile(2)检查依赖到的外部环境,如依赖的软件包make根据Makefile文件,会检测依赖的环境,进行构建应用程序makeinstall复......
  • 对于《程序是怎样跑起来的》我的理解
    首先,作者从计算机的硬件组成和指令集体系结构讲起,让我成功地理解了CPU、内存、硬盘等组件的工作原理。通过生动的图解和示例,我逐渐明白了计算机是如何将二进制代码转换成可执行的指令,以及这些指令是如何驱动程序运行的。其次,书中详细介绍了函数调用机制和数组的使用。作者通过丰......
  • 有效的括号
      /**@lcapp=leetcode.cnid=20lang=cpp**[20]有效的括号*///@lccode=startclassSolution{public:boolisValid(strings){stack<char>cs;for(charch:s){if(ch=='('||ch==......
  • 深入剖析MyBatis缓存机制
    第1章:引言大家好,我是小黑。今天我们要聊的是MyBatis的缓存机制。作为Java开发中经常使用的持久层框架,MyBatis以其灵活性和简便性而广受欢迎。但你知道吗,很多时候,正是因为这些特点,我们需要更深入地理解它的内部工作原理,尤其是缓存机制。这不仅能帮助我们更高效地使用MyBatis,还能......
  • 云计算-nacos入门以及生产配置举例
    生产上nacos配置使用简单举例,相关敏感信息已经去除nacos以ds的方式部署在华为云CCE的容器当中,后台微服务,sprintboot中写明nacos的依赖,dockerfile打包到镜像仓库,在CCE运行容器的时候,读取CCE中configmap获取配置项参数。好处是可以标准集中管理发布,适合变更发布运维详细请参考官方文......
  • 无涯教程-MATLAB - 多项式(Polynomials)
    MATLAB将多项式表示为行向量,其中包含按降序排序的系数。例如,方程P(x)=x4+7x3-5x+9可以表示为-p=[170-59];判断多项式polyval函数用于以指定值判断多项式。例如,要判断我们先前的多项式p,在x=4处,键入-p=[170-59];polyval(p,4)MATLAB执行上述语句并返......