首页 > 其他分享 >深入浅出 Spring AOP:概念、用法与实战代码

深入浅出 Spring AOP:概念、用法与实战代码

时间:2024-12-03 21:34:05浏览次数:6  
标签:Spring 深入浅出 切面 Aspect AOP org 方法

目录

深入浅出 Spring AOP:概念、用法与实战代码

一、Spring AOP 核心概念解读

1. Aspect(切面):舞台上的 “多面手” 之光

2. Join Point(连接点):演员表演的 “高光时刻”

3. Pointcut(切入点):镜头下的 “精选画面”

4. Advice(通知):导演下达的 “行动指令”

5. Weaving(织入):魔法融合的 “幕后编排”

二、Spring AOP 实战用法与代码示例

1. 项目环境搭建

2. 定义 Aspect 切面类

3. 验证切面功能

4. 拓展通知类型


在 Java 开发的广袤天地里,Spring 框架犹如一座巍峨的大厦,支撑起无数应用的构建与运行,而 Spring AOP(Aspect-Oriented Programming,面向切面编程)则是这座大厦中一抹灵动且强大的色彩,它为我们解决诸多横切关注点问题提供了优雅的方案。今天,就让我们一同深入探究 Spring AOP 的神秘世界,揭开它的面纱,看看其核心概念究竟如何具象化,又该如何在实际项目中施展 “魔法”。

一、Spring AOP 核心概念解读

1. Aspect(切面):舞台上的 “多面手” 之光

想象自己置身于一场华丽的舞台剧现场,灯光璀璨,演员们在台上演绎着精彩故事。Aspect 就如同那一束独特的光,不过它并非聚焦于某一个演员的一举一动,而是能够同时笼罩舞台上特定的一群演员或者某一特定场景区域。在代码世界里,Aspect 是一个封装了横切关注点逻辑的 Java 类,这些横切关注点往往游离于核心业务逻辑之外,却又在多个业务方法执行过程中频繁现身。比如,日志记录这个 “戏份” 贯穿于多个业务模块,无论是用户登录、商品查询还是订单提交等方法执行时,日志记录的 Aspect 就像一位恪尽职守的记录员,敏锐捕捉每个关键动作并记录在册,确保系统运行轨迹清晰可查。

2. Join Point(连接点):演员表演的 “高光时刻”

舞台上,演员的每一个举手投足、每一句台词吐露都是精彩瞬间,对应到程序中,Join Point 便是方法被调用执行的那一刻,是可以插入 Aspect 逻辑的 “黄金时机”。每当用户登录方法被触发、商品库存更新操作启动,这些方法执行的瞬间,就如同演员在舞台上的 “高光时刻”,成为了连接点。它们犹如一颗颗珍珠散落在业务代码的链条上,等待着 Aspect 这位 “能工巧匠” 按需镶嵌额外逻辑。

3. Pointcut(切入点):镜头下的 “精选画面”

倘若把所有连接点视作舞台上演员的全部表演时刻,那么 Pointcut 则是我们精心挑选、值得重点关注的那些片段。它通过特定表达式精准界定,恰似摄影师手中摄像机依据设定规则选定拍摄画面,比如 “仅捕捉以‘get’开头的方法执行瞬间”,这个规则所圈定的那些方法执行时刻,便是通过切点表达式定义的切入点,决定了 Aspect 逻辑究竟该在哪些业务方法处 “闪亮登场”。

4. Advice(通知):导演下达的 “行动指令”

在舞台剧幕后,导演会向工作人员下达各种指令,确保演出顺利且精彩。Advice 就如同导演给记录员(切面)的详细指示,明确在连接点(演员表演时刻)处,切面究竟要执行何种操作。常见的有 Before Advice(前置通知),仿若导演叮嘱记录员在演员上场前就得记下关键信息,在方法执行前做好准备工作,像权限校验前置通知可在业务方法调用前核验用户权限是否足够;After Returning Advice(后置通知),类似要求记录员在演员完美谢幕(方法正常返回)后,记录演出效果反馈,如记录业务方法成功执行后的返回值做数据分析;还有 After Throwing Advice(异常通知),当演员表演 “翻车”(方法抛出异常),记录员即刻按指令记录异常详情,方便后续故障排查。

5. Weaving(织入):魔法融合的 “幕后编排”

织入,无疑是将切面与业务代码巧妙融合的 “魔法” 环节,把 Aspect 逻辑丝丝入扣地嵌入目标对象(被代理对象)的过程,如同在演出筹备中将记录员(切面)精准安排到对应表演时刻,按导演指令(通知)开展工作。Spring AOP 提供了编译时织入、类加载时织入和运行时织入多种方式,恰似在不同阶段施展魔法,或在演出前剧本编排时(编译时织入)、演员候场准备时(类加载时织入),亦或是演出进行中(运行时织入)让切面与业务代码完美共舞。

二、Spring AOP 实战用法与代码示例

1. 项目环境搭建

首先,确保你的项目基于 Spring Boot 搭建(本文示例基于 Spring Boot 2.x 版本),在pom.xml文件中引入必要依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

这一依赖包如同开启 Spring AOP 大门的钥匙,将核心组件引入项目,为后续切面功能实现铺就基石。

2. 定义 Aspect 切面类

创建一个 Java 类,标注@Aspect注解,宣告其 “切面” 身份,同时可结合@Component注解使其能被 Spring 容器管理。以下是一个简单日志记录切面示例:

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class LoggingAspect {

    // 定义切入点,匹配com.example.demo包下所有类的所有方法
    @Before("execution(* com.example.demo..*(..))")
    public void logBeforeMethodExecution() {
        System.out.println("即将执行方法,记录日志:[方法执行前]");
    }
}

在上述代码中,@Before注解搭配切点表达式execution(* com.example.demo..*(..)),明确了这是一个前置通知,且作用于com.example.demo包及其子包下所有类的所有方法,意味着只要目标方法被调用,控制台就会输出日志提示。

3. 验证切面功能

com.example.demo包下创建一个简单的业务类,例如:

import org.springframework.stereotype.Service;

@Service
public class UserService {
    public void getUserInfo() {
        System.out.println("获取用户信息");
    }
}

编写测试类或者在项目启动后调用UserServicegetUserInfo方法,你会惊喜发现控制台先输出 “即将执行方法,记录日志:[方法执行前]”,再执行 “获取用户信息”,这表明切面逻辑已成功织入业务方法,按预期发挥日志记录前置通知作用。

4. 拓展通知类型

若想丰富切面功能,添加后置通知记录方法返回值(假设方法有返回值情况),可修改切面类如下:

import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class LoggingAspect {

    @Before("execution(* com.example.demo..*(..))")
    public void logBeforeMethodExecution() {
        System.out.println("即将执行方法,记录日志:[方法执行前]");
    }

    // 后置通知,记录方法返回值
    @AfterReturning(pointcut = "execution(* com.example.demo..*(..))", returning = "result")
    public void logAfterMethodExecution(Object result) {
        System.out.println("方法执行完毕,返回值为:" + result);
    }
}

相应修改业务类方法使其有返回值,再次调用测试,就能看到方法执行前后完整的日志记录,感受 Spring AOP 多类型通知协同编织代码 “防护网”,处理横切关注点的强大魅力。

Spring AOP 凭借其独特概念与灵活用法,宛如编程世界的瑞士军刀,巧妙化解日志记录、权限校验、事务管理等横切难题。通过理解核心概念、搭建实战环境、编写精妙切面代码,开发者得以在 Java 项目构建中优化代码结构、提升复用性与可维护性,让业务逻辑与通用功能泾渭分明又紧密协作,向着高效、优雅编程之路大步迈进。愿此番对 Spring AOP 的剖析,成为你编程行囊中的得力工具,助你攻克更多复杂开发场景。

标签:Spring,深入浅出,切面,Aspect,AOP,org,方法
From: https://blog.csdn.net/m0_57836225/article/details/144177440

相关文章

  • 利用注解和 AOP 实现权限认证:原理、实践与代码解析
    目录利用注解和AOP实现权限认证:原理、实践与代码解析一、核心思想二、目录三、代码示例(一)项目搭建与依赖引入(基于SpringBoot)(二)自定义权限注解(三)AOP切面类实现(四)远程权限服务接口(Feign示例)(五)在业务方法中应用注解一、核心思想在现代软件开发中,权限认证是保......
  • springboot基于springboot的论坛网站(代码+数据库+LW)
    摘要随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了论坛网站的开发全过程。通过分析论坛网站管理的不足,创建了一个计算机管理论坛网站的方案。文章介绍了论坛网站的系统分析部分,包括可行性分析等,系统设计部分主要介绍了系统功......
  • springboot靓车汽车销售网站(代码+数据库+LW)
    摘要随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了靓车汽车销售网站的开发全过程。通过分析靓车汽车销售网站管理的不足,创建了一个计算机管理靓车汽车销售网站的方案。文章介绍了靓车汽车销售网站的系统分析部分,包括可行性分......
  • 高校心理教育辅导|基于springBoot的高校心理教育辅导系统设计与实现(附项目源码+论文+
    私信或留言即免费送开题报告和任务书(可指定任意题目)目录一、摘要二、相关技术三、系统设计四、数据库设计  五、核心代码   六、论文参考  七、源码获取 一、摘要随着Internet技术的发展,心理教育辅导系统应运而生,心理教育辅导系统为用户提供了一个更为便......
  • 【开源】A060-基于Spring Boot的游戏交易系统的设计与实现
    ......
  • 免费送源码:Java+B/S+My eclipse+MySQL Springboot 连锁超市零售管理系统 计算机毕业设
         摘 要在网络信息的时代,众多的软件被开发出来,给用户带来了很大的选择余地,而且人们越来越追求更个性的需求。在这种时代背景下,超市零售管理只能以用户为导向,按品种小批量组织生产,以产品的持续创新作为超市零售管理最重要的竞争手段。系统采用了B/S结构,将所有业务......
  • Spring Cloud+Nacos+KMS 动态配置最佳实践
    作者:柳遵飞前言SpringCloud框架在微服务领域被广大开发者所使用,@Value是每位开发者都会接触到的注解,在SpringBean中可以通过Value注解引用application.properties属性,实现配置代码分离,提升应用代码部署的灵活性,但无法在运行期动态更新配置。Nacos是一款集服务发现和配......
  • 计算机毕业设计必看必学96341+springboot养老院信息管理系统原创定制程序单片机,java
    目  录1绪论1.1研究背景和意义1.2开发意义1.3论文结构与章节安排2 养老院信息管理系统系统分析2.1可行性分析2.1.1技术可行性分析2.1.2 经济可行性分析2.1.3法律可行性分析2.2系统功能分析2.2.1功能性分析2.2.2非功能性分析2.3 系统用......
  • 计算机毕业设计必看必学20599+springboot便利店管理系统原创定制程序单片机,java、PHP
    目  录摘要1绪论1.1课题目的与意义1.2国内外研究现状1.3论文结构与章节安排1.4Springboot框架介绍2 Springboot便利店管理系统系统分析2.1可行性分析2.1.1技术可行性分析2.1.2经济可行性分析2.1.3操作可行性分析2.2 系统功能分析2.2.1......
  • Springboot实验室管理系统i0o0a
    Springboot实验室管理系统i0o0a本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表项目功能:用户,实验室信息,实验器材,实验耗材,实验室预约开题报告内容一、项目背景随着教育信息化的快速发展,传统实验室管理......