Spring AOP切面编程颠覆传统!3大核心注解+5种通知类型,让业务代码纯净如初

本文涉及的产品
对象存储 OSS,20GB 3个月
对象存储OSS,敏感数据保护2.0 200GB 1年
文件存储 NAS,50GB 3个月
简介: 本文介绍了AOP(面向切面编程)的基本概念、优势及其在Spring Boot中的使用。AOP作为OOP的补充,通过将横切关注点(如日志、安全、事务等)与业务逻辑分离,实现代码解耦,提升模块化程度、可维护性和灵活性。文章详细讲解了Spring AOP的核心概念,包括切面、切点、通知等,并提供了在Spring Boot中实现AOP的具体步骤和代码示例。此外,还列举了AOP在日志记录、性能监控、事务管理和安全控制等场景中的实际应用。通过本文,开发者可以快速掌握AOP编程思想及其实践技巧。

📌 目录

  • AOP:面向切面编程 -> 代码解耦
  • AOP 的好处
  • Spring AOP
  • Spring Boot 中 AOP 的使用
  • AOP 应用场景
  • 总结

AOP:面向切面编程 -> 代码解耦

什么是 AOP?

AOP(Aspect Oriented Programming),即面向切面编程,是OOP(面向对象编程)的一种补充。OOP 擅长将程序分解成一个个模块化的单元(类),而 AOP 则致力于将横切关注点与业务逻辑分离。

横切关注点的例子:
  • 安全性检查
  • 日志记录
  • 性能统计
  • 事务管理

试想,如果将这些代码都写在业务逻辑中,就会出现代码冗余、耦合度高、维护困难等问题。AOP 的作用就是将这些横切关注点从业务逻辑中剥离出来,形成独立的模块(切面),然后通过配置的方式,将这些切面动态地织入到目标代码中。


AOP 的好处

使用 AOP 的好处就像拥有一个健康的体魄:

  1. 提高代码模块化:将横切关注点与业务逻辑分离,提高代码的可读性和可维护性。
  2. 减少代码重复:将通用功能封装成切面,避免重复编写代码。
  3. 增强代码灵活性:通过配置的方式动态地织入切面,方便地添加或移除功能。
  4. 提高代码可重用性:切面可以被多个模块共享,提高代码的复用率。

Spring AOP

Spring AOP 是 Spring 框架中一个重要的模块,它基于动态代理机制,在运行时将切面织入到目标对象中。

核心概念:

  • 切面(Aspect):横切关注点的模块化实现,例如日志切面、安全切面。
  • 连接点(Join Point):程序执行过程中可以被拦截的点,例如方法调用、异常抛出。
  • 切点(Pointcut):匹配连接点的表达式,定义哪些连接点需要被拦截。
  • 通知(Advice):切面在连接点上执行的操作,例如记录日志、校验权限。
  • 目标对象(Target Object):被切面织入的业务逻辑对象。
  • 织入(Weaving):将切面应用到目标对象的过程。

Spring Boot 中 AOP 的使用

Spring Boot中使用 AOP 非常简单,只需几步即可完成:

步骤一:引入 Spring AOP Starter 依赖

pom.xml 文件中添加如下依赖:

代码语言:xml

AI代码解释

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

步骤二:定义切面

创建一个类,并使用 @Aspect 注解标记,表明这是一个切面类。

代码语言:java

AI代码解释

import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;
@Aspect
@Component
public class LoggingAspect {
   // ...
}

步骤三:定义切点

使用 @Pointcut 注解定义切点,即哪些方法需要被增强。

代码语言:java

AI代码解释

@Pointcut("execution(* com.example.service.*.*(..))")
public void serviceMethods() {}

上述代码定义了一个名为 serviceMethods 的切点,它匹配 com.example.service 包下所有类的所有方法。

步骤四:定义通知

总体示例:

代码语言:java

AI代码解释

public class MyAspect {
    @Pointcut("execution(* com.test.service.*.*(..))")   // 切入点表达式
    public void pt() {}   // 定义此表达式为方法,后面直接使用方法,不用每次都写表达式
    // 前置通知
    @Before("pt()")
    public void before(JoinPoint joinPoint) {
        log.info("before ...");
    }
    // 环绕通知
    @Around("pt()")
    public Object around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        log.info("around before ...");
        // 调用目标对象的原始方法执行
        Object result = proceedingJoinPoint.proceed();
        log.info("around after ...");
        return result;
    }
    // 后置通知
    @After("pt()")
    public void after(JoinPoint joinPoint) {
        log.info("after ...");
    }
    // 返回后通知(程序在正常执行的情况下,会执行的后置通知)
    @AfterReturning("pt()")
    public void afterReturning(JoinPoint joinPoint) {
        log.info("afterReturning ...");
    }
    // 异常通知(程序在出现异常的情况下,执行的后置通知)
    @AfterThrowing("pt()")
    public void afterThrowing(JoinPoint joinPoint) {
        log.info("afterThrowing ...");
    }
}
使用 @Before@After@AfterReturning@AfterThrowing@Around 注解定义通知,即如何增强目标方法。

代码语言:java

AI代码解释

@Before("serviceMethods()")
public void logBefore(JoinPoint joinPoint) {
    String methodName = joinPoint.getSignature().getName();
    Object[] args = joinPoint.getArgs();
    log.info("方法 {} 开始执行,参数: {}", methodName, Arrays.toString(args));
}

上述代码定义了一个名为 logBefore 的前置通知,它会在目标方法执行之前打印方法名和参数。

注意事项:

代码语言:java

AI代码解释

/**
 * 多个切面类运行,与类名有关
 * 目标方法前,字母排前先执行
 * 目标方法后,字母排前后执行
 * 可以通过 @Order 注解实现自定义执行顺序
 */

使用方式总结

Spring Boot 对 Spring AOP 提供了自动配置,让你使用 AOP 更加方便快捷。

  1. 引入依赖:在 pom.xml 中添加 spring-boot-starter-aop 依赖。
  2. 定义切面:创建一个类,使用 @Aspect 注解标记为切面,并使用 @Component 注解将其注册为 Spring Bean。
  3. 定义切点:使用 @Pointcut 注解定义切点表达式,指定要拦截哪些方法。
  4. 定义通知:使用 @Before@After@Around 等注解定义通知,实现增强逻辑。
示例:

代码语言:java

AI代码解释

@Aspect
@Component
public class LoggingAspect {
    @Pointcut("execution(* com.example.service.*.*(..https://www.bestall.com.cn/))")
    public void serviceMethods() {}
    @Before("serviceMethods()")
    public void logBefore(JoinPoint joinPoint) {
        String methodName = joinPoint.getSignature().getName();
        log.info("方法 {} 开始执行...", methodName);
    }
}

AOP 应用场景

AOP 在实际开发中应用广泛,以下是一些常见的应用场景:

  1. 日志记录:记录方法的调用信息,方便调试和排查问题。
  2. 性能监控:统计方法的执行时间,识别性能瓶颈。
  3. 事务管理:将多个数据库操作封装成一个事务,保证数据的一致性。
  4. 安全控制:对方法进行权限验证,确保只有授权用户才能访问。

总结

AOP 是一种强大的编程思想,它可以帮助我们编写更加模块化、可维护和可扩展的代码。Spring AOP 框架为 java 开发者提供了一种便捷的方式来实现 AOP,让我们可以更加优雅地处理横切关注点,专注于业务逻辑的实现。

AOP 是我们在实际开发中比较重要的知识,是必须要掌握的。通过合理使用 AOP,我们可以大大简化代码结构,提升开发效率和代码质量。


相关文章
|
23天前
|
人工智能 量子技术 调度
别只盯着ChatGPT了,量子计算才是下一个能源“爆点”!
别只盯着ChatGPT了,量子计算才是下一个能源“爆点”!
93 17
|
22天前
|
存储 人工智能 自然语言处理
RAG:让AI聊天不再"张口就来"
想让你的AI助手不再一本正经地胡说八道?RAG技术就是那个神奇的'外挂'!通过一个智能客服的真实场景,轻松学会如何让AI既博学又靠谱,告别AI幻觉,拥抱真实世界的知识!
|
23天前
|
人工智能 大数据 机器人
物流卡住脖子?试试用大数据“开挂”一下!
物流卡住脖子?试试用大数据“开挂”一下!
65 0
|
23天前
|
人工智能 运维 Prometheus
运维再不“聪明点”,迟早被业务拖垮!
运维再不“聪明点”,迟早被业务拖垮!
99 0
|
1月前
|
机器学习/深度学习 人工智能 自然语言处理
工程师的AGI落地指南:从基础概念到智能体开发的完整地图
本文系统讲解大型语言模型(LLM)核心技术与开发实践,涵盖基础概念、模型架构、训练方法、应用策略与伦理安全,适合AI开发者全面学习与参考。
144 0
|
1月前
|
人工智能 JavaScript 测试技术
Cradle:颠覆AI Agent 操作本地软件,AI驱动的通用计算机控制框架,如何让基础模型像人一样操作你的电脑?
Cradle 是由 BAAI‑Agents 团队开源的通用计算机控制(GCC)多模态 AI Agent 框架,具备视觉输入、键鼠操作输出、自主学习与反思能力,可操作各类本地软件及游戏,实现任务自动化与复杂逻辑执行。
134 0
|
1月前
|
人工智能 语音技术 Docker
揭秘8.3k star 开源神器 VoiceCraft 用AI革新有声内容创作,只需几秒录音
VoiceCraft 是一款开源语音编辑与文本转语音(TTS)工具,仅需几秒录音即可实现语音克隆、插入、删除、替换等操作,支持零样本编辑和高自然度语音生成。适用于播客、短视频、有声书等内容创作场景,具备本地部署能力,已在 GitHub 获得 8.3k 星标。
129 0
|
29天前
|
消息中间件 人工智能 监控
【云故事探索 | NO.15】:阿里云云原生加速鸣鸣很忙数字化
【云故事探索 | NO.15】:阿里云云原生加速鸣鸣很忙数字化

热门文章

最新文章