AOP基本概念:

AOP是在不改变原有逻辑的情况下进行功能增强,是一种思想的体现,和面向对象一样是一种编程范式,通过将横切关注点(cross-cuttingconcerns)从业务逻辑中分s离出来,实现了关注点的模块化和可重用性。

AOP核心概念:

连接点(JoinPoint):

程序执行过程中的任意位置,springaop中,理解为方法的执行。

1
2
3
4
5
6
7
8
9
10
@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
@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
@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
//通知类
public class LoggingAspect {...}

切面(Asepect):

描述通知与切入点的对应关系。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//切面
@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
4
Before saving user: Logging user information...
Saving user: John
After saving user: Logging user information...

AOP的优点:

1提高代码的复用性和可维护性。复用性:一些新增的设置或新增功能可以被多个切入点调用。可维护性:对一些功能进行修改只需要在通知类里修改即可

2提高代码的可维护性和可读性。把重复性的代码从业务代码中抽离出来。

3降低模块之间的耦合性,横切关注点的解耦(如日志记录、安全性检查、事务管理等)。

4业务代码不受非业务代码的影响,逻辑更加清晰。