Spring AOP常见使用场景、术语及设计模式应用方式

 更新时间:2024年12月30日 16:18:29   作者:沉墨的夜  
AOP是一种编程思想,可以将横切关注点从业务逻辑中分离出来,以便更好地管理和维护,它通过使用Aspect、JoinPoint、Advice等术语来实现,代理、装饰器和拦截器等设计模式在AOP中经常被使用

AOP(面向切面编程)是一种编程思想,可以将程序中的横切关注点(如日志记录、安全性检查、性能监控等)从业务逻辑中分离出来,以便更好地管理和维护。

使用场景

  1. 日志记录:在程序执行期间,记录关键操作的执行情况、错误信息等。
  2. 安全性检查:在程序执行期间,检查用户的权限或身份验证,以确保只有授权的用户才能执行特定的操作。
  3. 事务管理:确保多个操作在一个事务中执行,以确保数据的完整性和一致性。
  4. 性能监控:监控程序执行的性能,包括执行时间、内存使用等指标,以便进行优化。
  5. 异常处理:在程序执行期间捕获和处理异常,以避免程序崩溃或出现未知错误。
  6. 缓存管理:管理程序中的缓存,包括缓存的存储、刷新和删除等操作。
  7. 国际化:管理程序中的国际化资源,以便程序能够在不同的语言环境中正确地运行。

常用术语

在 AOP 中,有一些常用的术语,包括 Aspect、Join Point 和 Advice 等,下面对这些术语进行解释:

  1. Aspect:切面,用于描述一个横切关注点的概念,通常是一个类或模块,其中包含了一组通用的横切关注点。
  2. Join Point:连接点,用于描述程序中的一个执行点,例如一个方法的调用、一个属性的赋值、一个异常的抛出等等。在 AOP 中,Join Point 是 AOP 框架中可以被拦截的程序执行点。
  3. Advice:通知,用于描述一个特定的横切关注点所执行的操作,包括前置通知(Before)、后置通知(After)、环绕通知(Around)、异常通知(After-Throwing)和返回通知(After-Returning)等等。
  4. Pointcut:切入点,用于描述一个或多个 Join Point 的集合,通常用一个表达式来定义。
  5. Target Object:目标对象,用于描述被通知的对象,即包含 Join Point 的对象。
  6. Weaving:织入,用于描述将 Aspect 中定义的 Advice 插入到目标对象的过程,通常是在程序运行期间完成的。

设计模式应用

在 AOP 中,代理、装饰器和拦截器等设计模式经常被使用,下面分别介绍它们在 AOP 中的应用:

  1. 代理模式:代理模式在 AOP 中的应用较为广泛。在 AOP 中,代理模式通常用于实现动态代理,即在程序运行时生成代理对象,代理对象包含了目标对象的所有方法,并且可以在方法执行前后插入额外的逻辑,如日志记录、性能监控、事务管理等。
  2. 装饰器模式:装饰器模式是一种结构型设计模式,它可以动态地为一个对象添加新的行为,而不需要对原始类进行修改。在 AOP 中,装饰器模式通常用于实现 Aspect,即将一组通用的横切关注点包装在一个 Aspect 中,然后将 Aspect 应用到目标对象中。
  3. 拦截器模式:拦截器模式是一种结构型设计模式,它可以在不修改原始类的情况下,通过拦截并修改方法的调用,来实现额外的逻辑。在 AOP 中,拦截器模式通常用于实现 Advice,即在特定的 Join Point 上执行特定的操作,例如在方法执行前后记录日志、验证权限、处理异常等。

示例代码

下面是一个简单的 Spring AOP 示例代码:

包含了如何定义切面、定义通知以及如何使用 AOP 在目标对象上进行拦截和增强:

//定义一个切面
@Aspect
@Component
public class LoggingAspect {
  
  //定义一个前置通知,拦截所有 public 方法
  @Before("execution(public * com.example.service.*.*(..))")
  public void logBefore(JoinPoint joinPoint) {
    System.out.println("执行方法:" + joinPoint.getSignature().getName());
  }
  
  //定义一个后置通知,拦截所有 save 方法
  @AfterReturning(pointcut = "execution(* com.example.service.*.save*(..))", returning = "result")
  public void logAfter(JoinPoint joinPoint, Object result) {
    System.out.println("方法执行结束:" + joinPoint.getSignature().getName() + ",返回值为:" + result);
  }
}

//定义一个业务类
@Service
public class UserService {

  public void login(String username, String password) {
    System.out.println("用户登录");
  }

  public void saveUser(User user) {
    System.out.println("保存用户信息");
  }
}

//在配置类中开启 AOP
@Configuration
@EnableAspectJAutoProxy
public class AppConfig {
}

在上述示例代码中,首先定义了一个切面 LoggingAspect,使用 @Aspect 和 @Component 注解进行标记。然后,在 LoggingAspect 中定义了两个通知方法,一个前置通知 logBefore,拦截所有 public 方法;一个后置通知 logAfter,拦截所有 save 方法。

接下来,在 UserService 类中定义了两个业务方法,login 和 saveUser。最后,在 AppConfig 配置类中使用 @EnableAspectJAutoProxy 注解开启 AOP。

在程序运行时,当调用 UserService 的 login 或 saveUser 方法时,AOP 框架会自动拦截这些方法,并根据 LoggingAspect 中定义的通知方法,执行相应的增强逻辑。

例如,当调用 saveUser 方法时,AOP 框架会先执行 logBefore 方法,在方法执行前输出日志;然后执行 saveUser 方法;最后执行 logAfter 方法,在方法执行后输出日志。

总之,Spring AOP 是一种非常强大的 AOP 框架,可以大大简化开发者的工作,提高代码的可维护性和可重用性。开发者可以通过上述示例代码学习如何使用 Spring AOP 进行拦截和增强目标对象的操作。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • IntelliJ IDEA中如何构建Spring Boot的项目

    IntelliJ IDEA中如何构建Spring Boot的项目

    这篇文章主要介绍了IntelliJ IDEA中如何构建Spring Boot的项目问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • 解析spring cloud ouath2中的Eureka

    解析spring cloud ouath2中的Eureka

    这篇文章主要介绍了spring cloud ouath2中的Eureka,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-02-02
  • Java并发编程系列之LockSupport的用法

    Java并发编程系列之LockSupport的用法

    这篇文章主要为大家介绍了Java LockSupport的用法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助,希望能够给你带来帮助
    2021-11-11
  • Java三种移位运算符原理解析

    Java三种移位运算符原理解析

    这篇文章主要介绍了Java三种移位运算符原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02
  • @Scheduled 如何读取动态配置文件

    @Scheduled 如何读取动态配置文件

    这篇文章主要介绍了@Scheduled 如何读取动态配置文件的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • 使用Runtime 调用Process.waitfor导致的阻塞问题

    使用Runtime 调用Process.waitfor导致的阻塞问题

    这篇文章主要介绍了使用Runtime 调用Process.waitfor导致的阻塞问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • 关于spring boot使用 jdbc+mysql 连接的问题

    关于spring boot使用 jdbc+mysql 连接的问题

    这篇文章主要介绍了spring boot使用 jdbc+mysql 连接,在这里mysql 8.x版本驱动包,要使用 com.mysql.cj.jdbc.Driver作为驱动类,文中给大家详细介绍,需要的朋友可以参考下
    2022-03-03
  • Spring Data JPA实现持久化存储数据到数据库的示例代码

    Spring Data JPA实现持久化存储数据到数据库的示例代码

    Spring Data JPA是Spring基于JPA规范的基础上封装的⼀套 JPA 应⽤框架,可使开发者⽤极简的代码即可实现对数据库的访问和操作。本文我们来了解如何用Spring Data JPA框架实现数据持久化存储到数据库,感兴趣的可以了解一下
    2022-04-04
  • Maven Spring jar包启动报错问题解决方案

    Maven Spring jar包启动报错问题解决方案

    maven 编译jar包,放在linux服务器启动不起来,提示:xxxx-0.0.1-SNAPSHOT.jar中没有主清单属性,接下来通过本文给大家分享问题原因及解决方案,感兴趣的朋友跟随小编一起看看吧
    2023-10-10
  • SpringBoot3整合邮件服务实现邮件发送功能

    SpringBoot3整合邮件服务实现邮件发送功能

    本文介绍了spring boot整合email服务,实现发送验证码,邮件(普通文本邮件、静态资源邮件、附件邮件),文中通过代码示例介绍的非常详细,坚持看完相信对你有帮助,需要的朋友可以参考下
    2024-05-05

最新评论