AOP

发表日期: 2023-06-19
更新日期: 2023-06-19
阅读量: 未知

AOP基本概念:

AOP(Aspect-Oriented Programming,面向切面编程)是一种编程范式,通过将横切关注点从业务逻辑中分离出来,实现关注点的模块化和可重用性,同时不改变原有逻辑。

AOP核心概念

连接点(JoinPoint)

连接点是程序执行过程中的特定位置,通常指方法的执行点。

1
2
3
4
5
6
7
8
9
java复制代码@Service
public class UserService {

public void saveUser(String username) {
// 保存用户信息的业务逻辑
// 连接点
System.out.println("Saving user: " + username);
}
}

切入点(Pointcut)

切入点定义了在应用通知的位置,可以是一个或多个连接点的集合。

1
2
3
4
5
6
7
8
9
10
java复制代码@Service
public class UserService {

public void saveUser(String username) {
// 保存用户信息的业务逻辑
// 连接点
// 切入点
System.out.println("Saving user: " + username);
}
}

通知(Advice)

通知是在切入点处执行的具体操作,例如在方法执行前或执行后执行的共性功能。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
java复制代码@Aspect
@Component
public class LoggingAspect {

@Before("execution(* com.example.service.UserService.saveUser(..))")
public void beforeSaveUser() {
System.out.println("Before saving user: Logging user information...");
}

@After("execution(* com.example.service.UserService.saveUser(..))")
public void afterSaveUser() {
System.out.println("After saving user: Logging user information...");
}
}

切面(Aspect)

切面将通知与切入点结合起来,描述了何时和在何处应用通知。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
java复制代码@Aspect
@Component
public class LoggingAspect {

@Before("execution(* com.example.service.UserService.saveUser(..))")
public void beforeSaveUser() {
System.out.println("Before saving user: Logging user information...");
}

@After("execution(* com.example.service.UserService.saveUser(..))")
public void afterSaveUser() {
System.out.println("After saving user: Logging user information...");
}
}

结果展示

1
2
3
sql复制代码Before saving user: Logging user information...
Saving user: John
After saving user: Logging user information...

AOP的优点

  1. 提高代码的复用性和可维护性。
  2. 提高代码的可读性和可维护性。
  3. 降低模块之间的耦合性,解耦横切关注点。
  4. 业务代码不受非业务代码的影响,逻辑更加清晰。