Spring AOP 入门、实现原理及实践案例

Spring AOP功能实现 一、AOP的基本概念: 1、什么是aop:AOP(Aspect Oriented Programming)称为面向切面编程,在程序开发中主要用来解决一些系统层面上的问题,比如日志,事务,权限等待,Struts2的拦截器设计就是基于AOP的思想,是个比较经典的例子。在不改变原有的逻辑的基础上,增加一些额外的功能。代理也是这个功能,读写分离也能用aop来做。AOP可以说是OOP(Object Oriented Programming,面向对象编程)的补充和完善。OOP引入封装、继承、多态等概念来建立一种对象层. 阅读详情

前言

  Spring 是目前 Java 领域最为流行的开发框架之一,它提供了很多方便快捷的功能,其中之一就是 AOP(Aspect Oriented Programming),即面向切面编程。本文将详细介绍 Spring AOP 的实现原理、核心概念以及在实际应用中的使用案例。

1. AOP 的基本概念

  1.1 切入点(Pointcut)

  切入点是一个表达式,用于描述哪些方法将被拦截执行,通常使用正则表达式或通配符来匹配方法名或类名。Spring AOP 支持两种类型的切入点:静态切入点和动态切入点。静态切入点在创建时就已经确定,而动态切入点则需要在运行时根据实际情况进行计算。

  1.2 通知(Advice)

  通知是指 AOP 在拦截到被选定的方法后,所执行的代码块。Spring AOP 中支持五种不同类型的通知:

  • 前置通知(Before Advice):在目标方法执行之前执行。
  • 后置通知(After Returning Advice):在目标方法正常完成后执行。
  • 异常通知(After Throwing Advice):在目标方法抛出异常时执行。
  • 最终通知(After Finally Advice):在目标方法完成之后执行,无论是否发生异常。
  • 环绕通知(Around Advice):覆盖目标方法的执行,需要手动调用目标方法。

  1.3 切面(Aspect)

  切面是将切入点和通知组合在一起的实体对象,用于描述哪些方法应该在何时被拦截,并指定要执行的通知代码块。

2. Spring AOP 的实现原理

  Spring AOP 的实现原理是基于 JDK 动态代理或 CGLIB 字节码技术。在目标对象上创建一个动态代理或子类,拦截所需要的方法并执行对应的通知,在执行完毕后再将控制权转交给目标对象。这样就可以在不修改目标对象代码的情况下,实现对目标方法的增强。

  具体来说,Spring AOP 拦截方法的实现分为以下几个步骤:

  1. 定义切面,配置切入点和通知。
  2. 根据目标对象类型创建代理对象。
  3. 拦截符合切入点要求的方法,并执行所配置的通知代码块。

3. Spring AOP 实践案例

  为了更好地理解 Spring AOP 的实现原理,下面以一个简单的实践案例为例:使用 AOP 打印每个方法执行的日志,日志内容包括方法执行、执行结果、异常信息等方面。

  3.1 定义切入点和通知

  首先,需要定义一个切入点,这里为了方便,直接匹配所有 public 方法:

@Pointcut("execution(public * *(..))")
public void logPointCut() {}

  然后,定义一个环绕通知,在目标方法执行前后打印日志:

@Around("logPointCut()")
public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
    long startTime = System.currentTimeMillis();

    Object result = joinPoint.proceed();

    long endTime = System.currentTimeMillis();
    long duration = endTime - startTime;

    String methodName = joinPoint.getSignature().getName();
    String className = joinPoint.getTarget().getClass().getSimpleName();
    String args = Arrays.toString(joinPoint.getArgs());

    if (result instanceof Serializable) {
        log.info("{}#{}({}, {}) : {} , 耗时 {} ms", className, methodName, args, result, duration);
    } else {
        log.info("{}#{}({}, [not serializable object]) , 耗时 {} ms", className, methodName, args, duration);
    }

    return result;
}

  上述代码中,@Around 注解表示该方法是一个环绕通知,并且会拦截名为 logPointCut() 的切入点所匹配到的所有方法。ProceedingJoinPoint 类型表示需要拦截的连接点,通过调用其 proceed() 方法可以继续执行原本要执行的目标方法,返回值类型为 Object,即目标方法的执行结果。

  3.2 配置 AOP

  接下来需要在 Spring 配置文件中配置 AOP,将切面和切入点以及通知绑定在一起:

<!-- 定义切面 -->
<bean id="logAspect" class="com.example.LogAspect"/>

<!-- 配置 AOP -->
<aop:config>
    <aop:aspect ref="logAspect">
        <!-- 声明切入点 -->
        <aop:pointcut id="logPointCut" expression="execution(public * *(..))"/>

        <!-- 声明通知 -->
        <aop:around method="around" pointcut-ref="logPointCut"/>
    </aop:aspect>
</aop:config>

  上述代码中,<bean> 标签定义了一个名为 logAspect 的 JavaBean 对象,并指定其类为 com.example.LogAspect,即定义了切面对象。而 <aop:config> 标签则表示开始 AOP 配置,其中 <aop:aspect> 定义了一个切面,其 ref 属性指向 logAspect,即引用前面定义的切面对象;<aop:pointcut> 声明了一个切入点,其 expression 属性使用与前面定义的一致;<aop:around> 则声明了一个环绕通知,将其方法名指定为 around,并将其与前面定义的切入点绑定在一起。

  3.4 SpringBoot版本的AOP案例

注意:在 Spring Boot 中使用 AOP 需要在启动类的配置中添加 @EnableAspectJAutoProxy 注解来开启自动代理功能,以便能够使用 AOP 切面。

@Aspect
@Component
public class LogAspect {

    @Pointcut("execution(public * *(..))")
    public void logPointCut() {}

    @Around("logPointCut()")
    public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
        long startTime = System.currentTimeMillis();

        Object result = joinPoint.proceed();

        long endTime = System.currentTimeMillis();
        long duration = endTime - startTime;

        String methodName = joinPoint.getSignature().getName();
        String className = joinPoint.getTarget().getClass().getSimpleName();
        String args = Arrays.toString(joinPoint.getArgs());

        if (result instanceof Serializable) {
            log.info("{}#{}({}, {}) : {} , 耗时 {} ms", className, methodName, args, result, duration);
        } else {
            log.info("{}#{}({}, [not serializable object]) , 耗时 {} ms", className, methodName, args, duration);
        }

        return result;
    }
}

  3.5 测试应用

  最后,在业务代码中添加一些方法并测试:

@Service
public class MyService {
    public void sayHello(String name) {
        System.out.println("Hello, " + name + "!");
    }
    
    public int divide(int a, int b) {
        return a / b;
    }
}

  上述代码定义了一个名为 MyService 的服务类,其中包含了两个简单的方法,分别是打印问候语和除法运算。现在,只需要在 Spring 容器中注入该服务类,并调用其方法即可,AOP 将会在控制台打印出对应的日志信息:

MyService myService = context.getBean(MyService.class);
myService.sayHello("World");
myService.divide(10, 2);
myService.divide(10, 0);

  其中第一行代码是从 Spring 容器中获取该服务类的实例对象,然后依次调用 sayHello、divide 方法,可以看到控制台输出了类似下面的日志信息:

com.example.MyService#sayHello([World], null) : null , 耗时 0 ms
com.example.MyService#divide([10, 2], 5) : 2 , 耗时 0 ms
com.example.MyService#divide([10, 0], java.lang.ArithmeticException: / by zero) , 耗时 1 ms

4. 总结

  Spring AOP 是一种很方便实用的面向切面编程技术,通过代理或字节码技术实现对目标方法的拦截和通知,从而实现对目标方法的增强。在实际应用中,通常使用切入点、通知和切面来描述 AOP 的核心概念,并通过配置文件将它们组合在一起来实现具体功能。

Spring——AOP原理及流程详解 基于5.3.9 版本的Spring源码,对AOP原理及流程详解,AOP是在Bean生成流程中什么位置介入处理的?各个通知方法又是怎么组装的?AOP真的只是动态代理这么简单吗? 阅读详情

相关推荐

Spring AOP —— 详解、实现原理、简单demo

AOP 就是面向切面的编程, 是一种思想,是对某一类事情的集中处理。

CYK_byte的博客 3525

【Spring】Spring AOP 初识及实现原理解析

AOP(Aspect Oriented Programming):面向切面编程,它是⼀种思想,它是对某⼀类事情的集中处理。在我们想要对某一件事情进行集中处理,就可以使用到AOP,它提供一种将程序中的横切关注点模块化的方式。在 AOP 中,我们将这些横切关注点称为“切面”,它们独立于业务逻辑模块,但是可以在程序运行的不同阶段被织入到业务逻辑中。简单来说,AOP 就是对某一件事进行集中处理的思想方式~使用@Aspect@Component // 随着框架的启动而启动。

xyk:的博客 3631

【Allegro学习笔记】常规标贴封装创建-0402封装创建实例

摘要 本文主要介绍如何使用Allegro制作表面贴装封装。 所使用的软件 使用Allegro制作常规贴片封装主要使用的软件有Pad Designer和Allegro 1 0402类封装制作 1.1 0402类封装焊盘分析 0402封装尺寸图如图1...

Honglong 1万+

Spring AOP 实现原理和使用场景

Spring AOP 是通过在目标方法执行前、执行后、抛出异常时等切入点执行切面代码的一种机制。其实现原理是使用动态代理技术,在方法运行时动态生成代理对象,然后插入切面代码。当执行目标方法时,由动态代理对象拦截方法并在适当的时间点执行切面代码,然后再调用实际的目标方法。在 Spring 中定义切面,提供一些特定的注解,如 @Before、@After、@Around 等,将切面适切地应用于业务逻辑中。

兴趣是最好的老师,勤能补拙 3582

基于IMX429-IMX430-IMX432-IMX437系列传感器的SLVS-MIPI桥接方案设计与实现

本文详细介绍了针对索尼IMX429、IMX430、IMX432及IMX437系列传感器的SLVS-MIPI桥接方案设计与实现。针对工业视觉、车载摄像头等应用中主流SoC仅支持MIPI接口的痛点,提出基于FPGA(如Lattice Crosslink-NX)的透传桥接方案,将传感器输出的SLVS信号无损转换为MIPI CSI-2信号,确保数据完整性与低延迟,并探讨了硬件选型、逻辑设计及多传感器兼容性等关键问题。

weixin_29230901的博客 460

告别‘耀斑’降落:手把手教你用PX4+激光测距仪实现固定翼精准自动着陆

本文详细介绍了如何利用PX4飞控与激光测距仪实现固定翼无人机的精准自动着陆,解决传统气压计在低空环境下的测量误差问题。通过硬件选型、安装要点、PX4参数配置及实战调校,帮助开发者实现厘米级高度感知,优化降落曲线,提升着陆稳定性与安全性。

weixin_30336061的博客 519

Spring AOP 实现原理

什么是AOP AOP(Aspect-OrientedProgramming,面向方面编程),可以说是OOP(Object-Oriented Programing,面向对象编程)的补充和完善。OOP引入封装、继承和多态性等概念来建立一种对象层次结构,用以模拟公共行为的一个集合。当我们需要为分散的对象引入公共行为的时候,OOP则显得无能为力。也就是说,OOP允许你定义从上到下的关系,但并不适合定义从

KevinJom的专栏 57万+

提示词编程在自动化内容审核中的应用

文章标题 提示词编程在自动化内容审核中的应用 关键词:提示词编程,自动化内容审核,人工智能,算法原理,系统架构设计,项目实战 摘要 本文旨在探讨提示词

AI天才研究院 1252

Spring的AOP实现原理

本学习笔记将尽可能的将AOP的知识讲解的通俗易懂,先从一个典型的问题出发,引入AOP这个概念,介绍AOP的基本概念,再到Spring中的AOP的实现方案,最后进行一个简单的总结归纳。本学习笔记中不考虑cglib、也不会太关注Spring AOP如何使用,而是尽可能的简单的说清楚AOP的工作原理。 笔记中贴出的源代码均是Spring 5.1.7-RELEASE 版本 问题提出 如下代码块,现在需要统计这个方法执行的耗时情况 public void runTask() { doSome

m0_57229961的博客 9666

Autosar诊断实战系列07-Dcm之0x19 06扩展数据配置及工程问题讨论

19 06扩展数据如何配置?如果某DTC没有出现过故障扩展数据该如何响应?

initiallizer的博客 1703

2020年大连理工大学《计算机控制技术》期末试卷

2020年大连理工大学《计算机控制技术》期末试卷 2020年大连理工大学《计算机控制技术》期末试卷 2020年大连理工大学《计算机控制技术》期末试卷 2020年大连理工大学《计算机控制技术》期末试卷 ...

无名何许人的博客 646

Spring中AOP的实现原理

一、什么是 AOP ? AOP(Aspect-Oriented Programming,面向方面编程),对 OOP(Object-Oriented Programming,面向对象编程) 【OOP与AOP】 概念 AOP(Aspect-Oriented Programming,面向方面编程) OOP(Object-Oriented Programming,面向对象编程) 方向 OOP 定义从上到下的关系 AOP 定义从左到右的关系 【两个部分】 核心关注点 业务处理的主要流程

qq_44918331的博客 1万+

1 电科院FTU检测标准学习笔记-外观检查

作者简介:本人从事电力系统多年,岗位包含研发,测试,工程等,具有丰富的经验在配电自动化验收测试以及电科院测试中,本人全程参与,积累了不少现场的经验。

sixtome 1849

Spring AOP的工作原理和实现方式

AOP是Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。

A_aspectJ的博客 2201

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Spring AOP的实现原理

本文深入解析Spring AOP的核心原理与应用场景,通过五大典型案例展示其在日志记录、权限校验、事务管理等企业级开发中的实战价值。文章首先剖析AOP如何解决OOP的代码冗余问题,详解关键概念如Pointcut、Advice等组件,并对比JDK动态代理与CGLIB代理的差异。随后通过完整流程揭秘AOP工作机理,重点给出日志记录、缓存优化等场景的代码实现方案,最后提供生产环境中的表达式规范、性能优化等最佳实践。AOP能显著提升代码复用率、降低耦合度,是Java开发者必备的高级技能。

Java开发者,专注后端技术分享,深耕框架实战与架构优化,持续输出优质技术干货。 1324

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Spring AOP实现原理

本内容主要介绍了Spring AOP的核心概念、实现机制及代理生成流程。涵盖切面(Aspect)、连接点(Join Point)、通知(Advice)、切点(Pointcut)等关键概念,解析了JDK动态代理与CGLIB代理的原理及对比,并深入探讨了通知执行链路和责任链模式的应用。同时,详细分析了AspectJ注解驱动的AOP解析过程,包括切面识别、切点表达式匹配及通知适配为Advice的机制,帮助理解Spring AOP的工作原理与实现细节。

m13299531475的博客 1190

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

深入浅出Spring AOP:原理、实战与最佳实践

AOP(Aspect-Oriented Programming) 是一种编程范式,用于解耦横切关注点(如日志、事务、权限)。通过将通用功能从业务逻辑中剥离,提升代码可维护性和复用性。

2301_80652249的博客 1304

Spring AOP:原理与实践

(一)传统 OOP 的局限性在传统的面向对象编程(OOP)中,我们通过封装、继承和多态来构建软件系统,将相关的数据和行为封装在对象中。然而,在实际开发中,存在一些功能,如日志记录、事务管理、权限控制等,它们并不属于业务逻辑的核心部分,但却横切了多个业务模块。如果采用 OOP 的方式来处理这些横切关注点,会导致代码的重复和臃肿。例如,在多个业务方法中都需要添加日志记录代码,这不仅使得代码量增加,而且当需求发生变化时,需要在多个地方进行修改,维护成本较高。(二)AOP 的概念引入。

LYH2771994122的博客 1074

Spring AOP实现原理简介

AOP联盟标准AOP联盟将AOP体系分为三层,从三层结构可以看出,AOP实现方式有很多种,包括反射、元数据处理、程序处理、拦截器处理等,通过本节学习,你就会看到Spring AOP的实现使用的是Java语言本身的特性,即Java Proxy代理类、拦截器技术实现。AOP简介概念切面(Aspect) :官方的抽象定义为“一个关注点的模块化,这个关注点可能会横切多个对象”。连接点(Joinpoint)...

wyl6019的博客 7万+

【Spring】Spring AOP入门及实现原理剖析

AOP (Aspect-Oriented Programming) 是一种编程范式,它提供一种将程序中的横切关注点模块化的方式。本文就AOP的组成与使用场景、如何通过Spring AOP实现相应的功能以及Spring AOP动态代理机制的实现原理进行了讲解。

黄小黄的博客 2687

Spring AOP深度解析:从实现原理到最佳实践

Spring AOP通过动态代理(JDK/CGLIB)实现横切逻辑与业务解耦,运行时织入增强。需注意代理限制(final类/方法不支持、private方法无法增强)及自调用问题。最佳实践包括精准切点、优先环绕通知、控制切面数量;性能优化可通过代理选择(单例用CGLIB、原型用JDK)和拦截器链精简实现。一文掌握原理、避坑与提效技巧。

雾里华的博客 1286

一文搞懂spring AOP原理,各种代理各种学,Spring AOP原理及实战.

前言 为什么会有面向切面编程(AOP)?我们知道Java是一个面向对象(OOP)的语言,但它有一些弊端,比如当我们需要为多个不具有继承关系的对象引入一个公共行为。 例如日志,权限验证,事务等功能时,只能在在每个对象里引用公共行为,这样做不便于维护,而且有大量重复代码,AOP的出现弥补了OOP的这点不足。 为了阐述清楚Spring AOP,我们从将以下方面进行讨论: 最新2020整理收集的一些面试题(都整理成文档),有很多干货,包含mysql,netty,spring,线程,spring cloud等详细讲解

a646705816的博客 5418

Spring Boot 项目中实现 AOP 的常见用法与案例

定义Retention;Target;在 Spring Boot 项目中,AOP 是实现横切关注点的强大工具。通过定义切面,可以在不改变业务代码的情况下实现日志记录、权限校验、性能监控等功能,从而提升代码的模块化和可维护性。结合实际需求和性能优化策略,合理使用 AOP,可以让你的项目更加高效和优雅。

一名热衷于技术的全栈开发者,专注于前端与后端的全面技术探索。在这里,我将分享我在技术领域的学习与成长,助力更多开发者的进步。 1297
上一篇: WebSocket协议介绍
下一篇: Java多线程实操之模拟扑克抓牌
JavaWizard-M
博客等级 码龄6年 3159粉丝 148原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值