热门标签 | 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.



推荐阅读
  • 探讨如何从数据库中按分组获取最大N条记录的方法,并分享新年祝福。本文提供多种解决方案,适用于不同数据库系统,如MySQL、Oracle等。 ... [详细]
  • 从 .NET 转 Java 的自学之路:IO 流基础篇
    本文详细介绍了 Java 中的 IO 流,包括字节流和字符流的基本概念及其操作方式。探讨了如何处理不同类型的文件数据,并结合编码机制确保字符数据的正确读写。同时,文中还涵盖了装饰设计模式的应用,以及多种常见的 IO 操作实例。 ... [详细]
  • Python处理Word文档的高效技巧
    本文详细介绍了如何使用Python处理Word文档,涵盖从基础操作到高级功能的各种技巧。我们将探讨如何生成文档、定义样式、提取表格数据以及处理超链接和图片等内容。 ... [详细]
  • 2023年京东Android面试真题解析与经验分享
    本文由一位拥有6年Android开发经验的工程师撰写,详细解析了京东面试中常见的技术问题。涵盖引用传递、Handler机制、ListView优化、多线程控制及ANR处理等核心知识点。 ... [详细]
  • 本文探讨了如何在编程中正确处理包含空数组的 JSON 对象,提供了详细的代码示例和解决方案。 ... [详细]
  • 分享一个简化版的Silverlight链接图项目:Link Map Simplified
    本文介绍了一个使用Silverlight开发的可视化工具,主要用于展示和操作复杂的实体关系图(Graph)。该工具在犯罪调查系统中得到了广泛应用,帮助用户直观地获取和理解相关信息。 ... [详细]
  • 本文探讨了Java编程的核心要素,特别是其面向对象的特性,并详细介绍了Java虚拟机、类装载器体系结构、Java类文件和Java API等关键技术。这些技术使得Java成为一种功能强大且易于使用的编程语言。 ... [详细]
  • 对象自省自省在计算机编程领域里,是指在运行时判断一个对象的类型和能力。dir能够返回一个列表,列举了一个对象所拥有的属性和方法。my_list[ ... [详细]
  • 解读MySQL查询执行计划的详细指南
    本文旨在帮助开发者和数据库管理员深入了解如何解读MySQL查询执行计划。通过详细的解析,您将掌握优化查询性能的关键技巧,了解各种访问类型和额外信息的含义。 ... [详细]
  • 本文介绍如何使用阿里云的fastjson库解析包含时间戳、IP地址和参数等信息的JSON格式文本,并进行数据处理和保存。 ... [详细]
  • Hadoop入门与核心组件详解
    本文详细介绍了Hadoop的基础知识及其核心组件,包括HDFS、MapReduce和YARN。通过本文,读者可以全面了解Hadoop的生态系统及应用场景。 ... [详细]
  • MySQL索引详解与优化
    本文深入探讨了MySQL中的索引机制,包括索引的基本概念、优势与劣势、分类及其实现原理,并详细介绍了索引的使用场景和优化技巧。通过具体示例,帮助读者更好地理解和应用索引以提升数据库性能。 ... [详细]
  • 解决JAX-WS动态客户端工厂弃用问题并迁移到XFire
    在处理Java项目中的JAR包冲突时,我们遇到了JaxWsDynamicClientFactory被弃用的问题,并成功将其迁移到org.codehaus.xfire.client。本文详细介绍了这一过程及解决方案。 ... [详细]
  • 本文介绍了多个关于JavaScript的书籍资源、实用工具和编程实例,涵盖从入门到进阶的各个阶段,帮助读者全面提升JavaScript编程能力。 ... [详细]
  • 在成功安装和测试MySQL及Apache之后,接下来的步骤是安装PHP。为了确保安全性和配置的一致性,建议在安装PHP前先停止MySQL和Apache服务,并将MySQL集成到PHP中。 ... [详细]
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社区 版权所有