内容
活动
关注

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

简介: 本文介绍了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,我们可以大大简化代码结构,提升开发效率和代码质量。


相关文章
|
2月前
|
安全 Java 应用服务中间件
Spring Boot + Java 21:内存减少 60%,启动速度提高 30% — 零代码
通过调整三个JVM和Spring Boot配置开关,无需重写代码即可显著优化Java应用性能:内存减少60%,启动速度提升30%。适用于所有在JVM上运行API的生产团队,低成本实现高效能。
236 3
|
2月前
|
缓存 监控 Java
SpringBoot @Scheduled 注解详解
使用`@Scheduled`注解实现方法周期性执行,支持固定间隔、延迟或Cron表达式触发,基于Spring Task,适用于日志清理、数据同步等定时任务场景。需启用`@EnableScheduling`,注意线程阻塞与分布式重复问题,推荐结合`@Async`异步处理,提升任务调度效率。
470 128
|
1月前
|
监控 Java Spring
AOP 切面编程
AOP(面向切面编程)通过动态代理在不修改源码的前提下,对方法进行增强。核心概念包括连接点、通知、切入点、切面和目标对象。常用于日志记录、权限校验、性能监控等场景,结合Spring AOP与@Aspect、@Pointcut等注解,实现灵活的横切逻辑管理。
345 6
AOP 切面编程
|
1月前
|
人工智能 监控 Java
零代码改造 + 全链路追踪!Spring AI 最新可观测性详细解读
Spring AI Alibaba 通过集成 OpenTelemetry 实现可观测性,支持框架原生和无侵入探针两种方式。原生方案依赖 Micrometer 自动埋点,适用于快速接入;无侵入探针基于 LoongSuite 商业版,无需修改代码即可采集标准 OTLP 数据,解决了原生方案扩展性差、调用链易断链等问题。未来将开源无侵入探针方案,整合至 AgentScope Studio,并进一步增强多 Agent 场景下的观测能力。
1261 31
|
1月前
|
安全 Java 测试技术
《深入理解Spring》单元测试——高质量代码的守护神
Spring测试框架提供全面的单元与集成测试支持,通过`@SpringBootTest`、`@WebMvcTest`等注解实现分层测试,结合Mockito、Testcontainers和Jacoco,保障代码质量,提升开发效率与系统稳定性。
|
1月前
|
XML Java 数据格式
《深入理解Spring》:AOP面向切面编程深度解析
Spring AOP通过代理模式实现面向切面编程,将日志、事务等横切关注点与业务逻辑分离。支持注解、XML和编程式配置,提供五种通知类型及丰富切点表达式,助力构建高内聚、低耦合的可维护系统。
|
1月前
|
XML Java 应用服务中间件
【SpringBoot(一)】Spring的认知、容器功能讲解与自动装配原理的入门,带你熟悉Springboot中基本的注解使用
SpringBoot专栏开篇第一章,讲述认识SpringBoot、Bean容器功能的讲解、自动装配原理的入门,还有其他常用的Springboot注解!如果想要了解SpringBoot,那么就进来看看吧!
324 2
|
2月前
|
XML Java 数据格式
常用SpringBoot注解汇总与用法说明
这些注解的使用和组合是Spring Boot快速开发和微服务实现的基础,通过它们,可以有效地指导Spring容器进行类发现、自动装配、配置、代理和管理等核心功能。开发者应当根据项目实际需求,运用这些注解来优化代码结构和服务逻辑。
278 12
|
2月前
|
Java 测试技术 数据库
使用Spring的@Retryable注解进行自动重试
在现代软件开发中,容错性和弹性至关重要。Spring框架提供的`@Retryable`注解为处理瞬时故障提供了一种声明式、可配置的重试机制,使开发者能够以简洁的方式增强应用的自我恢复能力。本文深入解析了`@Retryable`的使用方法及其参数配置,并结合`@Recover`实现失败回退策略,帮助构建更健壮、可靠的应用程序。
280 1
使用Spring的@Retryable注解进行自动重试
|
2月前
|
传感器 Java 数据库
探索Spring Boot的@Conditional注解的上下文配置
Spring Boot 的 `@Conditional` 注解可根据不同条件动态控制 Bean 的加载,提升应用的灵活性与可配置性。本文深入解析其用法与优势,并结合实例展示如何通过自定义条件类实现环境适配的智能配置。
167 0
探索Spring Boot的@Conditional注解的上下文配置
下一篇