什么是 Spring 的 AOP
Spring 的 AOP,全称 Aspect-Oriented Programming,面向切面编程的意思,是 Spring 框架的另一个核心概念。
简单来说,将一些跟业务没有关联性的逻辑剥离出来进行统一处理。
确切地说,Spring AOP通过切面(Aspects)将横切关注点从业务逻辑中分离,提高了代码的模块性。
这允许对一些横跨多个业务对象的非业务逻辑(如日志、事务、安全性等)进行统一处理,使代码更清晰易懂,同时避免了重复性代码。
AOP通过划分关注点和横切关注点的方式提高了代码的可维护性和可重用性。
没有使用AOP的代码:
public class UserService {
public void addUser() {
// 业务逻辑
Logger.log("User added"); // 重复的日志代码
}
public void updateUser() {
// 业务逻辑
Logger.log("User update"); // 重复的日志代码
}
}
使用AOP的代码:
@Aspect
public class LoggingAspect {
@Before("execution(* com.example.UserService.*(..))")
public void logBefore() {
Logger.log("User added");
}
@AfterReturning("execution(* com.example.UserService.*(..))")
public void logAfterReturning() {
Logger.log("After user operation");
}
}
public class UserService {
public void addUser() {
// 业务逻辑
}
}
Spring AOP涉及以下核心概念:
- 切面(Aspect): 横切关注点的模块化单元,它定义了在何处以及如何应用横切关注点。
- 连接点(Join Point): 在应用程序执行过程中,切面可以插入的点,如方法执行的时候。
- 通知(Advice): 切面在连接点上执行的具体操作,包括"前置通知"、"后置通知"、"环绕通知"等。
- 切入点(Pointcut): 定义一组连接点的表达式,指定切面在何处执行。
- 引入(Introduction): 允许切面为现有的类添加新方法或属性。
- 目标对象(Target Object): 切面所影响的原始对象。
- 代理(Proxy): 由AOP框架生成的对象,用于将横切逻辑应用到目标对象上。