热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

SpringAOP核心概念与术语详解

面向切面编程(AOP)是Spring框架的两大核心概念之一,另一个核心概念是控制反转(IoC)。AOP通过在应用程序中分离横切关注点,如日志记录、事务管理和安全性,从而提高代码的模块化和可维护性。本文将深入探讨AOP的核心概念和术语,帮助读者更好地理解和应用这一重要技术。

AOPAspect-oriented Programming的缩写,是Spring的两大核心概念之一(另一概念是IoC)。

初次接触AOP编程,会被一些术语搞懵,本文就简单介绍一下这些术语的概念,与读者共勉。

Aspect(切面)

Aspect的作用是对具有横切性质的业务逻辑进行集中处理,典型的应用就是Spring中的事务管理功能。

在Spring中,可以用注解@Aspect定义一个类为一个切面,也可以采用XML的形式定义一个类为切面。在切面类中我们需要定义pointcut(切入点),advice(通知)。Spring会在符合pointcut定义的join point(连接点)处应用advice

Join point(连接点)

程序执行过程中的某个点,如方法执行或异常处理。对于Spring AOP来说,join point仅代表方法执行。

Advice(通知)

aspect中进行定义,对满足pointcut定义的join point进行额外的功能增强(扩展)。Spring AOP是以拦截器的形式来对join point应用advice的。

Type of Advice(通知类型)

  • Before advice:在join point之前执行的advice。当且仅当在before advice中抛出异常时,程序才可能不执行join point。即原有的业务方法一定会被执行,无法用before advice进行拦截处理,除非before advice中抛出了异常。
  • After returning advice:在joint point正常运行结束(不抛出异常)之后执行的advice
  • After throwing advice:在joint point抛出异常之后执行的advice
  • After (finally) advice:无论joint point是否抛出异常,都会执行的advice
  • Around advice:最强大的一种通知,既可以在joint point之前进行增强,也可以在joint point之后进行增强,甚至可以对joint point进行拦截处理(即选择不执行原有的业务方法)。

尽管around advice很强大,甚至可以代替before advice和after returning advice,但实际选择通知类型的时候,还是需要和具体的业务逻辑相结合,选择最小最贴切的通知类型。如果想根据join point的返回结果更新缓存值,最好使用after returning advice。虽然around advice也能满足需求,但在around advice中需要调用JointPoint类中的proceed()方法(即需要手动调用原有的业务逻辑方法),这显然会增加程序出错的可能性。

Pointcut(切入点)

Pointcut之于join point就像正则表达式之于字符串,pointcutjoin point提供了一种模式定义。Spring AOP中使用了AspectJ的pointcut模式定义语言,具体语法请见Spring AOP之pointcut语法

Introduction(引入)

Introduction代表为一个类添加的新字段或方法定义。Spring AOP允许我们为任何对象introduce(引入)新的接口实现,比如我们可以使用introduction让一个bean实例实现IsModified接口,以简化缓存处理逻辑。

Target object(目标对象)

Target object是被一个或多个Aspect增强的对象。Spring AOP是通过运行时生成代理类来实现的,target object就是那个被代理的对象。

AOP proxy(AOP代理对象)

AOP proxy就是target object被增强后的对象,在Spring AOP中是通过JDK动态代理或者CGLIB代理技术实现的。

Weaving(织入)

Weaving就是用aspect增强target object,使其成为AOP proxy的过程,可以在编译时期(如ApsectJ编译器)、载入时期或运行时期进行。Spring AOP在运行时为target object织入aspect

References

Spring Framework 5.2.5 Reference Doc.



推荐阅读
  • Spring框架中的面向切面编程(AOP)技术详解
    面向切面编程(AOP)是Spring框架中的关键技术之一,它通过将横切关注点从业务逻辑中分离出来,实现了代码的模块化和重用。AOP的核心思想是将程序运行过程中需要多次处理的功能(如日志记录、事务管理等)封装成独立的模块,即切面,并在特定的连接点(如方法调用)动态地应用这些切面。这种方式不仅提高了代码的可维护性和可读性,还简化了业务逻辑的实现。Spring AOP利用代理机制,在不修改原有代码的基础上,实现了对目标对象的增强。 ... [详细]
  • 如何在IntelliJ IDEA中生成Maven项目的所有Jar包依赖关系图
    本文详细介绍了如何在IntelliJ IDEA中生成Maven项目的完整Jar包依赖关系图。通过具体步骤和示例,帮助开发者清晰地理解并掌握这一重要功能,适合希望深入了解Maven依赖管理的读者学习参考。 ... [详细]
  • 在使用Keil C51创建51单片机项目时,启动代码中包含多个关键元素,这些元素确保了系统的正确初始化和运行。主要包括复位向量、中断向量表、系统时钟配置、寄存器初始化以及主函数入口等。这些组件共同协作,为后续的应用程序执行提供稳定的基础。 ... [详细]
  • Python 实战:异步爬虫(协程技术)与分布式爬虫(多进程应用)深入解析
    本文将深入探讨 Python 异步爬虫和分布式爬虫的技术细节,重点介绍协程技术和多进程应用在爬虫开发中的实际应用。通过对比多进程和协程的工作原理,帮助读者理解两者在性能和资源利用上的差异,从而在实际项目中做出更合适的选择。文章还将结合具体案例,展示如何高效地实现异步和分布式爬虫,以提升数据抓取的效率和稳定性。 ... [详细]
  • 如何高效启动大数据应用之旅?
    在前一篇文章中,我探讨了大数据的定义及其与数据挖掘的区别。本文将重点介绍如何高效启动大数据应用项目,涵盖关键步骤和最佳实践,帮助读者快速踏上大数据之旅。 ... [详细]
  • 基址获取与驱动开发:内核中提取ntoskrnl模块的基地址方法解析
    基址获取与驱动开发:内核中提取ntoskrnl模块的基地址方法解析 ... [详细]
  • 字节码开发笔记:深入解析与应用技巧 ... [详细]
  • Java Web开发中的JSP:三大指令、九大隐式对象与动作标签详解
    在Java Web开发中,JSP(Java Server Pages)是一种重要的技术,用于构建动态网页。本文详细介绍了JSP的三大指令、九大隐式对象以及动作标签。三大指令包括页面指令、包含指令和标签库指令,它们分别用于设置页面属性、引入其他文件和定义自定义标签。九大隐式对象则涵盖了请求、响应、会话、应用上下文等关键组件,为开发者提供了便捷的操作接口。动作标签则通过预定义的动作来简化页面逻辑,提高开发效率。这些内容对于理解和掌握JSP技术具有重要意义。 ... [详细]
  • 本文详细探讨了OpenCV中人脸检测算法的实现原理与代码结构。通过分析核心函数和关键步骤,揭示了OpenCV如何高效地进行人脸检测。文章不仅提供了代码示例,还深入解释了算法背后的数学模型和优化技巧,为开发者提供了全面的理解和实用的参考。 ... [详细]
  • 在Python编程中,探讨了并发与并行的概念及其区别。并发指的是系统同时处理多个任务的能力,而并行则指在同一时间点上并行执行多个任务。文章详细解析了阻塞与非阻塞操作、同步与异步编程模型,以及IO多路复用技术的应用。通过模拟socket发送HTTP请求的过程,展示了如何创建连接、发送数据和接收响应,并强调了默认情况下socket的阻塞特性。此外,还介绍了如何利用这些技术优化网络通信性能和提高程序效率。 ... [详细]
  • 在Python多进程编程中,`multiprocessing`模块是不可或缺的工具。本文详细探讨了该模块在多进程管理中的核心原理,并通过实际代码示例进行了深入分析。文章不仅总结了常见的多进程编程技巧,还提供了解决常见问题的实用方法,帮助读者更好地理解和应用多进程编程技术。 ... [详细]
  • 如何在Lua中调用C语言编译的动态链接库
    本文介绍了如何在Lua中调用C语言编译的动态链接库。通过详细步骤和示例代码,帮助开发者理解和掌握这一技术。参考了《Lua编程入门》一书中的相关内容,并结合实际操作经验,提供了更加清晰和实用的指导。此外,还探讨了在不同操作系统下编译和链接Lua的方法,为跨平台开发提供了有价值的参考。 ... [详细]
  • FastDFS Nginx 扩展模块的源代码解析与技术剖析
    FastDFS Nginx 扩展模块的源代码解析与技术剖析 ... [详细]
  • 技术分享:深入解析GestureDetector手势识别机制
    技术分享:深入解析GestureDetector手势识别机制 ... [详细]
  • 在尝试对从复杂 XSD 生成的类进行序列化时,遇到了 `NullReferenceException` 错误。尽管已经花费了数小时进行调试和搜索相关资料,但仍然无法找到问题的根源。希望社区能够提供一些指导和建议,帮助解决这一难题。 ... [详细]
author-avatar
无心之无心
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有