Spring AOP常见使用场景、术语及设计模式应用方式
AOP(面向切面编程)是一种编程思想,可以将程序中的横切关注点(如日志记录、安全性检查、性能监控等)从业务逻辑中分离出来,以便更好地管理和维护。
使用场景
- 日志记录:在程序执行期间,记录关键操作的执行情况、错误信息等。
- 安全性检查:在程序执行期间,检查用户的权限或身份验证,以确保只有授权的用户才能执行特定的操作。
- 事务管理:确保多个操作在一个事务中执行,以确保数据的完整性和一致性。
- 性能监控:监控程序执行的性能,包括执行时间、内存使用等指标,以便进行优化。
- 异常处理:在程序执行期间捕获和处理异常,以避免程序崩溃或出现未知错误。
- 缓存管理:管理程序中的缓存,包括缓存的存储、刷新和删除等操作。
- 国际化:管理程序中的国际化资源,以便程序能够在不同的语言环境中正确地运行。
常用术语
在 AOP 中,有一些常用的术语,包括 Aspect、Join Point 和 Advice 等,下面对这些术语进行解释:
Aspect:切面,用于描述一个横切关注点的概念,通常是一个类或模块,其中包含了一组通用的横切关注点。Join Point:连接点,用于描述程序中的一个执行点,例如一个方法的调用、一个属性的赋值、一个异常的抛出等等。在 AOP 中,Join Point 是 AOP 框架中可以被拦截的程序执行点。Advice:通知,用于描述一个特定的横切关注点所执行的操作,包括前置通知(Before)、后置通知(After)、环绕通知(Around)、异常通知(After-Throwing)和返回通知(After-Returning)等等。Pointcut:切入点,用于描述一个或多个 Join Point 的集合,通常用一个表达式来定义。Target Object:目标对象,用于描述被通知的对象,即包含 Join Point 的对象。Weaving:织入,用于描述将 Aspect 中定义的 Advice 插入到目标对象的过程,通常是在程序运行期间完成的。
设计模式应用
在 AOP 中,代理、装饰器和拦截器等设计模式经常被使用,下面分别介绍它们在 AOP 中的应用:
- 代理模式:代理模式在 AOP 中的应用较为广泛。在 AOP 中,代理模式通常用于实现动态代理,即在程序运行时生成代理对象,代理对象包含了目标对象的所有方法,并且可以在方法执行前后插入额外的逻辑,如日志记录、性能监控、事务管理等。
- 装饰器模式:装饰器模式是一种结构型设计模式,它可以动态地为一个对象添加新的行为,而不需要对原始类进行修改。在 AOP 中,装饰器模式通常用于实现 Aspect,即将一组通用的横切关注点包装在一个 Aspect 中,然后将 Aspect 应用到目标对象中。
- 拦截器模式:拦截器模式是一种结构型设计模式,它可以在不修改原始类的情况下,通过拦截并修改方法的调用,来实现额外的逻辑。在 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 进行拦截和增强目标对象的操作。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
springboot获取resources下static目录的位置
这篇文章主要为大家详细介绍了springboot获取resources下static目录的位置的三种常用方法,文中的示例代码讲解详细,感兴趣的小伙伴可以参考一下2024-12-12
spring 整合 mybatis 中数据源的几种配置方式(总结篇)
因为spring 整合mybatis的过程中, 有好几种整合方式,尤其是数据源那块,经常看到不一样的配置方式,总感觉有点乱,所以今天有空总结下,感兴趣的朋友跟随脚本之家小编一起学习吧2018-05-05
Java如何替换RequestBody和RequestParam参数的属性
近期由于接手的老项目中存在所有接口中新增一个加密串来给接口做一个加密效果,所以就研究了一下Http请求链路,发现可以通过 javax.servlet.Filter去实现,这篇文章主要介绍了Java替换RequestBody和RequestParam参数的属性,需要的朋友可以参考下2023-10-10
IDEA整合Dubbo+Zookeeper+SpringBoot实现
初学者,想自己动手做一个简单的demo,本文主要介绍了IDEA整合Dubbo+Zookeeper+SpringBoot实现,需要的朋友们下面随着小编来一起学习学习吧2021-06-06
java JDBC系列教程之JDBC类的简析与JDBC的基础操作
这篇文章主要介绍了java JDBC系列教程之JDBC类的简析与JDBC的基础操作,本文分步骤通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2020-07-07


最新评论